pandas用cumsum多条件累计求和及SettingWithCopyWarning问题解决
问题解答
1 使用cumsum()实现多条件累计求和
无需嵌套循环,直接用pandas分组+条件筛选的原生语法即可实现需求,代码如下:
import pandas as pd import numpy as np # 转换AMOUNT列为数值类型 df['AMOUNT'] = pd.to_numeric(df['AMOUNT']) # 筛选TYPE为BUY的行,按NAME分组后对AMOUNT做组内累计求和 df['ACCUMULATE'] = df[df['TYPE'] == 'BUY'].groupby('NAME')['AMOUNT'].cumsum() # 将SELL行的NaN值替换为空字符串,匹配预期输出格式 df['ACCUMULATE'] = df['ACCUMULATE'].fillna('').astype(str)
运行上述代码得到的结果和你给出的预期效果完全一致,且在数据量较大时运行效率远高于嵌套循环实现。
2 SettingWithCopyWarning警告的原因与解决方法
产生原因
该警告是pandas的安全提示,触发原因是你使用了链式索引操作:df.ACCUMULATE.iloc[counter] 属于连续两次索引取值,pandas无法确定本次操作返回的是原始数据的视图还是副本,怕你修改了副本但没有改动到原始数据,因此抛出警告提醒你确认操作有效性。
解决方法
- 优先修改索引写法:赋值时统一用
.loc同时指定行和列,避免链式操作,示例写法为df.loc[counter, 'ACCUMULATE'] = cumulativeValue - 显式生成数据副本:如果确定操作对象是独立的新DataFrame,可以在创建时加
.copy(),示例:df = pd.DataFrame(...).copy(),从根源避免视图和副本的歧义 - 不推荐方案:如果确认操作逻辑无误,也可以手动关闭该警告:
pd.set_option('mode.chained_assignment', None)
内容的提问来源于stack exchange,提问作者vitalstrike82
相关产品推荐
相关产品推荐

