如何用Pandas正确读取格式不一致的CSV并关联订阅用户来源信息?
解决CSV读取异常及订阅用户信息匹配问题
1. 修复CSV读取格式异常
由于read行有6个字段,subscribe行仅3个字段,直接用pd.read_csv会导致列对齐混乱,先按行读取并补全缺失字段:
import pandas as pd # 逐行读取并处理每行字段 rows = [] with open('example.csv', 'r', encoding='utf-8') as f: # 读取表头(如果CSV第一行是表头) header = f.readline().strip().split(';') for line in f: parts = line.strip().split(';') # 给subscribe行补全缺失字段为None if len(parts) == 3: parts += [None, None, None] rows.append(parts) # 转为规范DataFrame,无表头则手动定义columns data = pd.DataFrame(rows, columns=header)
若CSV无表头,可手动指定列名:
columns = ['时间', '操作类型', '国家', '用户ID', '来源', '大洲'] data = pd.DataFrame(rows, columns=columns)
2. 提取用户的基础信息(从read行)
从read行中提取每个用户的有效信息,可选择取最新或首次的记录(按业务需求):
# 筛选read行,排除用户ID为空的无效记录 user_info = data[data['操作类型'] == 'read'].dropna(subset=['用户ID']) # 转换时间列为datetime类型,用于排序取最新记录 user_info['时间'] = pd.to_datetime(user_info['时间']) # 按用户ID分组,取最新一条的国家/来源/大洲信息 user_latest_info = user_info.sort_values('时间').groupby('用户ID').last()[['国家', '来源', '大洲']]
若需取首次记录,将last()替换为first()即可。
3. 匹配订阅用户的信息
将订阅用户数据与提取的用户信息表合并:
# 筛选所有订阅用户 subscribe_users = data[data['操作类型'] == 'subscribe'] # 合并数据,匹配对应信息 subscribe_users_with_info = pd.merge( subscribe_users, user_latest_info, on='用户ID', how='left' # 保留所有订阅用户,未匹配到的字段显示NaN )
4. 处理无匹配记录的订阅用户
根据业务需求处理未匹配到信息的用户:
- 标记为未知:
subscribe_users_with_info.fillna({'国家': '未知', '来源': '未知', '大洲': '未知'}, inplace=True)
- 过滤无匹配记录的用户:
subscribe_users_with_info = subscribe_users_with_info.dropna(subset=['国家'])
内容的提问来源于stack exchange,提问作者Bia
相关产品推荐
相关产品推荐

