如何对Pandas DataFrame按日期聚合求和并实现按日单条记录展示?重塑与新建DataFrame哪种方案更优?
按日期聚合Pandas DataFrame的最优方案
嘿,其实你完全不用纠结重塑或者手动新建DataFrame——Pandas本身就有专门对付这类需求的分组聚合工具,这才是最直接高效的选择,比你提到的两种思路都靠谱多了。
你的需求本质就是按day列分组,对其他所有列做求和运算,这正是groupby搭配聚合函数的典型场景。既不需要绕弯子去重塑数据(比如melt/pivot这类操作反而会增加复杂度),也没必要手动去构建新DataFrame(容易出错还冗余)。
具体实现代码
先给你一个可直接运行的示例,方便你测试:
import pandas as pd # 构造你提供的示例数据 data = { 'day': [1,1,1,1,2,2,2], 'x_count': [8,6,5,11,11,13,18], 'x_max': [230,174,218,91,128,156,191], 'y_count': [18,12,21,32,17,16,22], 'y_max': [127,121,184,162,151,148,120] } df = pd.DataFrame(data) # 核心聚合操作:按day分组,对所有列求和 aggregated_df = df.groupby('day', as_index=False).sum()
运行后得到的结果就是你想要的每日一条记录的聚合数据:
| day | x_count | x_max | y_count | y_max |
|---|---|---|---|---|
| 1 | 30 | 713 | 83 | 594 |
| 2 | 42 | 475 | 55 | 419 |
(注:你示例里第一天的x_count写的是40,但按原始数据计算实际是30,应该是笔误啦,代码会严格基于输入数据做求和)
为什么不选你提到的两种方案?
- 重塑DataFrame:比如先把宽表转成窄表(melt),分组后再转回来(pivot),这完全是画蛇添足。代码会更冗长,运行效率也更低,完全没必要走这个弯路。
- 手动新建DataFrame:需要循环每一天,手动计算每列的和再拼接成新表。这种方法不仅代码繁琐,而且当数据量较大时,循环的性能远不如Pandas内置的向量化操作,还容易出现索引错误、列名不一致之类的小问题。
总结
直接用groupby+sum的方案就好,这是Pandas处理分组聚合需求的标准做法,简洁、高效还不容易出错,完全能满足你的需求~
内容的提问来源于stack exchange,提问作者ShaneK
相关产品推荐
相关产品推荐

