如何用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
相关产品推荐
相关产品推荐

