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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:06:11