pandas panda groupby与lambda

pobjuy32  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(48)

我试图通过功能来了解Pandas群

import pandas as pd
data=[['a',3],['a',3],['b',1],['a',0],['b',0]]
df=pd.DataFrame(data,columns=['Room','Value'])
print(df)

sum_df=df.groupby(['Room']).agg(
 sumValue =('Value','sum'), 
 nonBlankOccasion =('Value', lambda x: x>0).count())
).reset_index()
print(sum_df)

字符串
我试图得到一个结果的房间,总和(值)和数字的场合非零值。但我不能得到正确的答案,通过使用上述代码。它给了我的计数所有记录的房间

Room  sumValue  nonBlankOccation
0    a         6                 3
1    b         1                 2


但是,如果我改成

sum_df=df.groupby(['Room']).agg(
 sumValue =('Value','sum'),
 nonBlankOccasion =('Value', lambda x:(x>0).sum())
).reset_index()


结果是正确的。

Room  sumValue  nonBlankOccation
0    a         6                 2
1    b         1                 1


有谁能帮我理解为什么这里是sum()而不是count()?非常感谢!
ELAC
我在group by函数中尝试了sum()和count()。我希望count()给我给予正确的答案,但sum()是正确的。我想知道为什么。

amrnrhlw

amrnrhlw1#

如果你打印出lambda函数的一个参数,你会看到它是pandas Series的一个对象。每个组的类型都被打印出来,因此打印了两次:

sum_df=df.groupby(['Room']).agg(
    nonBlankOccasion =('Value', lambda x: print(type(x>0)))
).reset_index()

# > <class 'pandas.core.series.Series'>
# > <class 'pandas.core.series.Series'>

字符串
然后你可以打印出你到底在计算/求和什么:

sum_df=df.groupby(['Room']).agg(
    nonBlankOccasion =('Value', lambda x: print(x>0))
).reset_index()

# > 0     True
# > 1     True
# > 3    False
# > Name: Value, dtype: bool
# > 2     True
# > 4    False
# > Name: Value, dtype: bool


它们都是具有True / False值的pandas Series,都具有组长度。
因此,当应用count时,你会得到序列的长度,即组的大小。当求和时,你会得到正确的结果,因为它与序列中True值的数量相同,这是你要找的。

相关问题