在Pandas中按名称分组,生成多列累计和列的实现问题
分组计算累计和生成新列的解决方案
你的需求是按列a分组,计算b和c的累计和得到新列d,但原代码使用sum()导致了NaN,原因是:
groupby('a')['b','c'].sum()计算的是每个分组内b和c的总和,返回的结果只有每个分组一行数据,和原DataFrame的索引不匹配,赋值后自然出现NaN。- 你需要的是逐行累计求和,而不是分组总和。
正确实现代码
可以先计算每行b与c的和,再按a分组做累计求和:
import pandas as pd # 构造你的数据集 df = pd.DataFrame({ 'a': ['Joe', 'Joe', 'Joe', 'Adam', 'Adam', 'Adam'], 'b': [1, 1, 0, 1, 0, 0], 'c': [0, 0, 1, 0, 1, 0] }) # 生成d列:先求每行b+c,再分组累计求和 df['d'] = (df['b'] + df['c']).groupby(df['a']).cumsum()
运行结果
a b c d 0 Joe 1 0 1 1 Joe 1 0 2 2 Joe 0 1 3 3 Adam 1 0 1 4 Adam 0 1 2 5 Adam 0 0 2
补充说明
另一种等价写法,用apply实现:
df['d'] = df.groupby('a').apply(lambda group: (group['b'] + group['c']).cumsum()).droplevel(0)
两种写法都能得到你想要的结果,第一种更简洁高效。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

