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

pandas循环拆分单个DataFrame为多个子表并计算累计和

按names列拆分DataFrame并计算分组累计和

原代码问题点

  • 原始数据构造存在语法错误:字符串值未加引号、amount列20 25缺失分隔逗号、列名前后不一致(混用names/name)
  • 循环内变量引用混乱:循环变量name是字符串类型,无法直接作为DataFrame赋值;子表变量名错用names/owner_names,赋值目标和引用对象完全不匹配
  • 未做副本拷贝,直接切片赋值容易触发pandas的SettingWithCopyWarning警告

修正实现

推荐用字典存储拆分后的子DataFrame,避免动态生成全局变量的维护问题,代码如下:

import pandas as pd

# 构造原始测试数据
raw_df = pd.DataFrame({
    'names': ['joe', 'joe', 'bob', 'john', 'john'],
    'order_id': [10, 12, 5, 20, 25],
    'amount': [100, 1000, 200, 20, 25]
})

sub_dfs = {}
for name in raw_df['names'].unique():
    # 筛选对应名字的子表,加copy避免链式赋值警告
    current_sub = raw_df.loc[raw_df['names'] == name].copy()
    # 计算当前子表amount列的累计和
    current_sub['cummulative_sum'] = current_sub['amount'].cumsum()
    sub_dfs[name] = current_sub

调用时直接按名字取对应子表即可,比如执行print(sub_dfs['joe'])输出结果为:

names  order_id  amount  cummulative_sum
0   joe        10     100              100
1   joe        12    1000             1100

注:你给出的示例中joe第二行累计和写为110属于笔误,按你提供的amount值100+1000计算结果为1100,若第二行amount实际为10,累计和才会是110

更高效率的无循环写法

如果数据量很大,逐行循环筛选效率较低,可以直接用pandas分组计算逻辑先算完所有累计和再拆分:

# 按names分组直接计算全量累计和
raw_df['cummulative_sum'] = raw_df.groupby('names')['amount'].cumsum()
# 一次性拆分所有子表存入字典
sub_dfs = {name: group for name, group in raw_df.groupby('names')}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:36:28