You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:59:53