pandas读取含重复列名的CSV时如何高效处理数据查询
pandas处理CSV重复列订单数据方案
核心思路
这类单订单多商品横向存储的宽表,不需要手动枚举所有带.1/.2后缀的重复列,用pandas原生方法就能自动适配任意数量的重复列组,后续新增商品列也不需要修改代码。
方案1:宽表转长表(推荐,长期使用首选)
pandas读取CSV时自动给同名列加数字后缀的规则,刚好适配wide_to_long方法的列识别逻辑,转换后每一行对应单个订单里的一件商品,后续查询、统计完全不需要感知原始表的重复列结构。
import pandas as pd food = pd.read_csv("food.csv") # 自动合并所有重复的商品描述、价格列,转换为长表 long_food = pd.wide_to_long( food, stubnames=["Item Description", "Item Cost"], # 要合并的重复列的公共名称 i="Order Number", # 订单唯一标识列 j="item_rank", # 自动生成的商品序号,标记是订单内第几个商品 sep=".", # 列名前缀和后缀的分隔符,对应pandas自动加的点 suffix=r"\d*" # 匹配数字后缀,同时兼容第一列无后缀的情况 ).reset_index().dropna(subset=["Item Description", "Item Cost"]) # 删掉空商品行
转换完成后可以直接按单商品列的逻辑写查询:
- 查询售价13.1美元巧克力对应的订单号:
target_orders = long_food[ (long_food["Item Description"] == "Chocolate") & (long_food["Item Cost"] == 13.1) ]["Order Number"].unique() print(target_orders) # 输出 [111 114 115],不会漏掉非第一组列的匹配记录
- 统计所有订单中巧克力的平均消费金额:
choco_avg = long_food[long_food["Item Description"] == "Chocolate"]["Item Cost"].mean() print(choco_avg) # 自动统计所有组列的巧克力记录,结果为11.06
方案2:临时查询不重构表结构
如果只是单次查询不需要转换表结构,可以通过列名前缀自动匹配所有同名列,逐行判断是否满足条件,也不需要手动列列名:
# 自动拿到所有商品描述列、商品价格列 desc_cols = food.columns[food.columns.str.startswith("Item Description")] cost_cols = food.columns[food.columns.str.startswith("Item Cost")] # 逐行判断:任意一组商品列满足「描述是巧克力+价格13.1」则命中 match_mask = ((food[desc_cols] == "Chocolate") & (food[cost_cols].values == 13.1)).any(axis=1) print(food[match_mask]["Order Number"].to_string(index=False)) # 输出111、114、115,和长表方案结果一致
方案选择建议
- 长期使用、需要频繁做商品维度统计筛选:优先选转长表方案,代码可读性最高,后续CSV新增任意多组商品列,原有代码都不需要修改。
- 单次临时查询:选列名匹配方案即可,不需要额外做表结构转换,执行效率更高。
内容的提问来源于stack exchange,提问作者Chris Wong
相关产品推荐
相关产品推荐

