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

如何高效地按ID和周度日期聚合Pandas DataFrame?

高效实现按ID和周聚合Pandas DataFrame

当然有更高效的实现方式!完全不用手动遍历ID,Pandas的分组功能就能轻松搞定这个需求,而且性能比循环好太多了~

首先,我们先把你的示例数据用代码还原出来:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'Publish date': ['2000-01-02', '2000-01-03', '2000-02-17', '2000-01-04'],
    'ID': [0, 0, 0, 1],
    'Price': [10, 20, 30, 40]
})

# 务必将日期列转换为datetime类型,这是时间分组的基础
df['Publish date'] = pd.to_datetime(df['Publish date'])

接下来就是核心的聚合操作,直接用groupby同时按ID和周频率分组,再指定聚合规则即可:

# 按ID和周分组,聚合Price求和,Publish date取组内最早日期(匹配你的期望输出)
result = df.groupby(
    ['ID', pd.Grouper(key='Publish date', freq='W', closed='left', label='left')],
    as_index=False
).agg({
    'Publish date': 'min',
    'Price': 'sum'
})

# 调整列顺序,和你想要的格式一致
result = result[['Publish date', 'ID', 'Price']]

运行这段代码后,得到的结果完全符合你的要求:

Publish date  ID  Price
0   2000-01-02   0     30
1   2000-02-17   0     30
2   2000-01-04   1     40

关键细节说明:

  • pd.Grouper(key='Publish date', freq='W'):指定按Publish date列以周(W)为频率分组。如果你的周定义和默认不同(比如周一作为周起始),可以改成freq='W-MON',同时配合closed和label参数调整分组的闭合和标签规则。
  • as_index=False:让分组后的结果保持DataFrame格式,而不是多级索引。
  • agg方法:对不同列指定不同的聚合逻辑——Publish date取组内最早的日期(保证和你的输出格式一致),Price做求和操作。

这种方法是矢量化操作,比遍历ID的循环效率高得多,尤其是当你的数据量很大时,优势会更明显。

内容的提问来源于stack exchange,提问作者Mozzie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:59:09