pandas groupby - 自定义函数

3

我有下面这个数据框,我要使用groupby和sum()函数来处理它:

d = {'col1': ["A", "A", "A", "B", "B", "B", "C", "C","C"], 'col2': [1,2,3,4,5,6, np.nan, np.nan, np.nan]}

df = pd.DataFrame(data=d)

df.groupby("col1").sum()

这将导致以下结果:
col1 col2   
A   6.0
B   15.0
C   0.0

我希望C显示NaN而不是0,因为C的所有值都是NaN。 我如何实现这一点? 使用lambda函数的apply()函数吗? 任何帮助将不胜感激。


1
逻辑是否为 NaN 是因为 每个 值都是 NaN 吗?对于一个包含 1 2 NaN 的组,你应该返回 NaN 还是 3? - ALollz
3个回答

3
请使用以下内容:
df.groupby('col1').apply(pd.DataFrame.sum,skipna=False).reset_index(drop=True)
#Or --> df.groupby('col1',as_index=False).apply(pd.DataFrame.sum,skipna=False)

没有使用apply(),感谢@piRSquared:

df.set_index('col1').sum(level=0, min_count=1).reset_index()

感谢 @Alollz:

如果您想返回包含 NaN 而不仅仅是 NaN 的组的总和

df.set_index('col1').sum(level=0,min_count=1).reset_index()

输出

  col1  col2
0  AAA   6.0
1  BBB  15.0
2  CCC   NaN

2
不,它的精神太类似于你的了。它应该作为评论放在这里或者你的帖子中。如果你愿意,可以随意添加它。 - piRSquared
1
@piRSquared 这里唯一的问题是当A和B包含NaN时,结果将为NaN。 - BENY
3
好的,我会尽力进行翻译。根据您提供的内容,我认为这可能是 min_count=1 - ALollz
1
@ALollz 我认为你是对的。 (-: 取决于 OP 是想让一个 nan 炸掉整个组还是只有当所有的 nan 都炸掉时。 - piRSquared
1
我的答案与原来一样,但加上了 min_count 参数:df.set_index('col1').sum(level=0, min_count=1).reset_index() - piRSquared
显示剩余8条评论

2
感谢 @piRSquared,@Alollz 和 @anky_91:
您可以不设置索引和重置索引即可使用:
"Original Answer" 翻译成 "最初的回答"
d = {'col1': ["A", "A", "A", "B", "B", "B", "C", "C","C"], 'col2': [1,2,3,4,5,6, np.nan, np.nan, np.nan]}

df = pd.DataFrame(data=d)

df.groupby("col1", as_index=False).sum(min_count=1)

输出:

  col1  col2
0    A   6.0
1    B  15.0
2    C   NaN

这个完美地运作了。非常聪明。我从来没有想过要检查sum()的参数。再次感谢大家的帮助。 - SM_Erd

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接