Python中按city_id分组后按周聚合DataFrame的更优方法问询
高效实现按city_id分组的周度Quantity求和聚合
嗨,很高兴帮你搞定这个需求!你提到的拆分DataFrame再逐个聚合合并的思路确实能达到目的,但Pandas本身就提供了更简洁、高效的原生方案,完全不用手动拆分,代码可读性和性能都更好。
正确的实现方式
首先要确保你的日期列是datetime类型(如果还不是的话,先转换),然后直接用groupby + resample的组合就能一步到位:
import pandas as pd # 第一步:确保日期列是datetime格式(假设你的日期列名为'date') df['date'] = pd.to_datetime(df['date']) # 第二步:按city_id分组,再对每个组按周聚合Quantity的和 # 这里用on='date'指定日期列(如果日期是DataFrame的索引,可以省略这个参数) df_weekly = df.groupby('city_id').resample( 'W', # 周度聚合,默认每周日为周期结束日 on='date', loffset=pd.offsets.timedelta(days=-8) # 调整结果的日期偏移,匹配你原来的需求设置 )['Quantity'].sum().reset_index()
为什么这个方法比拆分合并更优
- 代码更简洁:省去了循环拆分、逐个处理、合并结果的繁琐步骤,一行核心代码搞定,可读性拉满
- 性能更出色:Pandas的
groupby和resample都是经过底层优化的,比手动循环处理子DataFrame效率高得多,尤其是数据集较大时,差距会很明显 - 减少出错概率:手动拆分合并容易出现索引对齐错误、遗漏分组等问题,原生方法从根源上避免了这些风险
额外的优化建议
- 调整周的结束日期:默认
'W'是按周日结束的周聚合,如果你需要其他结束日(比如周一),可以直接用'W-MON',这样就不用依赖loffset调整日期,更直观:# 按周一结束的周聚合 df_weekly = df.groupby('city_id').resample('W-MON', on='date')['Quantity'].sum().reset_index() - 处理缺失周的数据:如果某个city_id在某周没有数据,
resample会生成NaN值,要是需要把这些缺失值转为0,可以加.fillna(0):df_weekly = df.groupby('city_id').resample('W', on='date')['Quantity'].sum().fillna(0).reset_index()
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

