You need to enable JavaScript to run this app. 如何用Python或pandas实现CSV行转列及多ID过滤操作
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python或pandas实现CSV行转列及多ID过滤操作

基于pandas实现长表转宽表的解决方法

你要的长结构转宽表操作,是pandas原生支持的透视能力范畴,不需要手动遍历拼接数据,按以下步骤操作即可:

1. 数据读取与预处理

你的原始文件以|为分隔符,且列名、数据字段前后都存在冗余空格/符号,读入时先做清洗:

import pandas as pd

# 读取分隔符为|的文件,自动跳过字段前后的空格
df = pd.read_csv("你的CSV文件路径", sep="|", skipinitialspace=True)

# 清理列名的冗余空格、末尾的多余符号(比如原key_id.列名里的点)
df.columns = df.columns.str.strip().str.rstrip(".")

# 清理所有文本字段的前后空格
df = df.apply(lambda col: col.str.strip() if col.dtype == "object" else col)

# 统一转成数值类型,避免后续计算报错
df = df.astype({"customer_id": int, "key_id": int, "quantity": int})

2. 执行透视转换

直接调用pivot_table实现行、列、值的映射,同时自动处理缺失值填充:

result = df.pivot_table(
    index="customer_id",   # 以唯一customer_id作为每行的索引
    columns="key_id",      # 以所有唯一key_id作为新表的列标题
    values="quantity",     # 单元格对应quantity字段的取值
    aggfunc="sum",         # 同客户同key_id存在多条记录时自动聚合求和
    fill_value=0           # 无匹配记录的单元格直接填充0,和你要求的客户2的999列值完全匹配
)

3. 调整输出格式

生成的结果默认列名为数值类型的key_id,可按需调整为字符串格式展示,和示例输出完全对齐:

result.columns = result.columns.astype(str)
print(result)

执行后输出的表格效果为:

777  888  999
customer_id
1            3    2    3
2            6    1    0

常见注意点

  • 相比纯pivot方法,pivot_table的健壮性更强:如果真实业务数据中存在同一客户同一key_id的多条记录,纯pivot会直接抛出重复索引的报错,而pivot_table会按照聚合规则自动合并数据,不需要额外做去重过滤
  • 之前你提到无法通过两个ID完成过滤的问题,本质是没有用对长表转宽表的原生接口,不需要手写循环遍历每个客户、每个key拼字典,原生透视方法的处理效率比手动循环高几个数量级,适配万级甚至十万级的数据集规模。

内容的提问来源于stack exchange,提问作者codeDojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 19:06:07