Pandas按日期分组求和:DataFrame行数不匹配问题求助
解决方案
核心思路
你的报错原因是df2.groupby(["D"]).agg({"E": sum})的结果行数和df1的行数不匹配,直接赋值必然触发长度错误。最优方案是用pandas向量化操作替代逐行循环,既高效又简洁。
步骤1:先对df2按日期聚合求和
先处理df2,生成「日期-对应E列总和」的映射关系:
# 生成索引为日期、值为对应E列总和的Series sum_series = df2.groupby("D")["E"].sum()
步骤2:将聚合结果匹配到df1的日期列
用map方法自动匹配df1的A列日期,缺失的日期会返回NaN,可按需填充为0:
# 直接匹配,缺失日期显示NaN df1["E_sum"] = df1["A"].map(sum_series) # 若希望缺失日期的总和显示为0,添加fillna df1["E_sum"] = df1["A"].map(sum_series).fillna(0)
为什么比iterrows更优?
- 向量化操作是pandas原生优化的计算方式,数据量越大,对比逐行循环的性能优势越明显;
- 代码逻辑清晰,无需手动处理索引位置,避免
iloc可能带来的越界或匹配错误。
示例验证
假设测试数据:
import pandas as pd df1 = pd.DataFrame({"A": ["2023-01-01", "2023-01-02", "2023-01-03"]}) df2 = pd.DataFrame({ "D": ["2023-01-01", "2023-01-01", "2023-01-02"], "E": [10, 20, 30] }) sum_series = df2.groupby("D")["E"].sum() df1["E_sum"] = df1["A"].map(sum_series).fillna(0)
最终df1结果:
| A | E_sum |
|---|---|
| 2023-01-01 | 30 |
| 2023-01-02 | 30 |
| 2023-01-03 | 0 |
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

