如何高效地按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
相关产品推荐
相关产品推荐

