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

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效率高得多,尤其是数据集较大时,差距会很明显
  • 减少出错概率:手动拆分合并容易出现索引对齐错误、遗漏分组等问题,原生方法从根源上避免了这些风险

额外的优化建议

  1. 调整周的结束日期:默认'W'是按周日结束的周聚合,如果你需要其他结束日(比如周一),可以直接用'W-MON',这样就不用依赖loffset调整日期,更直观:
    # 按周一结束的周聚合
    df_weekly = df.groupby('city_id').resample('W-MON', on='date')['Quantity'].sum().reset_index()
    
  2. 处理缺失周的数据:如果某个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:18