按日期索引与分组对Pandas DataFrame求和的优雅实现方案
按日期索引和客户分组求和的优雅实现方案
这事儿简单!我经常处理这种带重复日期索引的销售数据聚合需求,给你两种直观又优雅的实现方式,按需选择就行:
方法一:用groupby直接聚合(最灵活)
这是Pandas里最常规的分组聚合方式,既能保留层级索引,也能转成普通的平表结构:
步骤1:先构造示例数据(模拟你的场景)
import pandas as pd data = { 'quantity': [1, 10, 5, 2, 3], 'group': [100, 102, 102, 100, 102] } # 把日期转成标准DatetimeIndex dates = pd.to_datetime(['2018-03-22', '2018-03-24', '2018-03-25', '2018-03-25', '2018-03-25']) df = pd.DataFrame(data, index=dates)
步骤2:核心聚合代码
如果你想要日期+分组作为层级索引的紧凑结果:
# 按日期索引和group字段分组,对quantity求和 summed_df = df.groupby([df.index, 'group'])['quantity'].sum()
输出结果是带MultiIndex的Series,结构清晰:
date group 2018-03-22 100 1 2018-03-24 102 10 2018-03-25 100 2 102 8 Name: quantity, dtype: int64
如果想要平表结构(每一行对应一组日期+客户分组的求和结果),只需要加个reset_index:
summed_df = df.groupby([df.index, 'group'])['quantity'].sum().reset_index(name='total_quantity')
最终得到的结构化DataFrame如下:
| date | group | total_quantity |
|---|---|---|
| 2018-03-22 | 100 | 1 |
| 2018-03-24 | 102 | 10 |
| 2018-03-25 | 100 | 2 |
| 2018-03-25 | 102 | 8 |
方法二:用pivot_table生成透视表(更直观)
如果你想直接得到宽表格式(把客户分组作为列,日期作为行),用pivot_table一步到位,非常适合后续做趋势分析或可视化:
summed_df = df.pivot_table( index=df.index, # 行维度:日期索引 columns='group', # 列维度:客户分组 values='quantity', # 聚合目标字段:数量 aggfunc='sum', # 聚合方式:求和 fill_value=0 # 无记录的日期-分组组合填充0 )
输出的宽表结果如下:
| group | 100 | 102 |
|---|---|---|
| 2018-03-22 | 1 | 0 |
| 2018-03-24 | 0 | 10 |
| 2018-03-25 | 2 | 8 |
内容的提问来源于stack exchange,提问作者Newbie2014
相关产品推荐
相关产品推荐

