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
相关产品推荐
相关产品推荐

