如何将含重复日期的多产品DataFrame转换为产品作为数据列的结构
如何将含重复日期的多产品DataFrame转换为产品作为数据列的结构
嗨,这个需求其实用Pandas的内置函数就能轻松搞定,完全不用你想的那种手动逐个产品筛选再合并的繁琐操作——这才是最高效的方式!
核心解决方案:用pivot快速转换
你的原始数据里,每个「日期+产品」的组合都是唯一的(看示例里没有重复项),这种情况用pivot函数一行代码就能完成转换,完美匹配你的需求。
先给你完整的可复现代码,你可以直接套用到自己的DataFrame上:
import pandas as pd # 先构造和你示例一致的原始DataFrame(你自己的代码里可以跳过这步,直接用你的原始df) data = { 'Date': ['1/1/25', '2/1/25', '3/1/25', '1/1/25', '2/1/25', '3/1/25', '1/1/25', '2/1/25', '3/1/25'], 'Data': [1,2,3,1,4,5,1,6,7], 'Product': ['A','A','A','B','B','B','C','C','C'] } df = pd.DataFrame(data) # 核心转换步骤 pivoted_df = df.pivot(index='Date', columns='Product', values='Data').reset_index() # 把列名改成你想要的「Data_A、Data_B」格式 pivoted_df.columns = ['Date'] + [f'Data_{col}' for col in pivoted_df.columns[1:]]
运行后你会得到完全符合预期的结果:
Date Data_A Data_B Data_C 0 1/1/25 1 1 1 1 2/1/25 2 4 6 2 3/1/25 3 5 7
代码解释
pivot(index='Date', columns='Product', values='Data'):指定用Date作为行标识,Product的取值作为新列名,Data的值填充到对应的单元格里。reset_index():把原来作为行索引的Date变回普通列,符合你想要的输出结构。- 最后一行的列名重命名:把原来的
A、B、C改成Data_A、Data_B、Data_C,完全匹配你的需求。
特殊情况处理:如果有重复的「日期+产品」组合
如果你的原始数据里,同一个日期同一个产品对应多条Data记录(比如1/1/25的产品A有两个Data值),pivot会报错,这时候就用pivot_table,它可以自动聚合重复的数据:
# 比如用平均值聚合重复项,也可以换成sum、max、min等你需要的聚合方式 pivoted_df = df.pivot_table( index='Date', columns='Product', values='Data', aggfunc='mean' # 这里可以替换成你需要的聚合函数 ).reset_index() pivoted_df.columns = ['Date'] + [f'Data_{col}' for col in pivoted_df.columns[1:]]
关于你最初的想法
你说的「筛选每个产品再合并」的方法确实可行,但当产品数量很多的时候,代码会变得非常冗长——你要逐个筛选、逐个合并,还得注意合并的键和列名,很容易出错。而用pivot/pivot_table的话,不管你有10个还是100个产品,一行核心代码就能搞定,效率和可读性都高太多了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

