如何为Pandas DataFrame添加分组聚合求和列(解决NaN问题)
解决分组求和后添加到原DataFrame的NaN问题
我明白你遇到的问题了——直接把groupby的求和结果赋值给新列时,因为索引不匹配,导致所有值都变成了NaN。这是因为df.groupby('A')['C'].sum()返回的Series,它的索引是'A'列的唯一值(bar和foo),而原DataFrame的索引是0到7,两者无法对应上,所以就填充了NaN。
下面给你两种简单有效的解决方法:
方法一:使用transform方法(推荐)
transform方法会将分组计算的结果广播到原DataFrame的每一行,自动匹配对应的分组,完美解决索引不匹配的问题:
import pandas as pd import numpy as np # 初始化你的DataFrame df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 'C' : [1,2,8,2,3,4,8,7], 'D' : np.random.randn(8)}) # 使用transform添加分组求和列 df['Sum'] = df.groupby('A')['C'].transform('sum')
执行后你就能得到想要的结果:
A B C D Sum
0 foo one 1 1.701138 27
1 bar one 2 0.771723 8
2 foo two 8 0.624447 27
3 bar three 2 1.725457 8
4 foo two 3 0.742048 27
5 bar two 4 0.166653 8
6 foo one 8 -0.605956 27
7 foo three 7 0.160273 27
方法二:先计算求和结果再合并
如果你更习惯用合并的方式,也可以先把分组求和的结果转成带普通索引的DataFrame,再和原DataFrame合并:
# 计算分组求和并重置索引 sum_df = df.groupby('A')['C'].sum().reset_index(name='Sum') # 合并到原DataFrame df = df.merge(sum_df, on='A')
这种方法也能得到完全一样的正确结果,适合需要单独处理求和结果的场景。
内容的提问来源于stack exchange,提问作者Souleymane
相关产品推荐
相关产品推荐

