我正在试着通过功能来理解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函数中try 了sum()和count().我期待count()给我正确的答案,然而sum()是正确的.我想知道为什么.

推荐答案

如果您打印出实际上是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 系列,都是群体长度.

所以当应用count时,你得到的是序列的长度,也就是组的大小. 求和时,您会得到正确的结果,因为它与您要查找的级数中的True值的数量相同.

Python相关问答推荐

如何计算部分聚合数据的统计数据

每个组每第n行就有Pandas

pyautogui.locateOnScreen在Linux上的工作方式有所不同

如何在PIL、Python中对图像应用彩色面膜?

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

jit JAX函数中的迭代器

使用新的类型语法正确注释ParamSecdecorator (3.12)

Gekko:Spring-Mass系统的参数识别

在Pandas DataFrame操作中用链接替换'方法的更有效方法

如果值不存在,列表理解返回列表

Python库:可选地支持numpy类型,而不依赖于numpy

根据二元组列表在pandas中创建新列

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

不允许访问非IPM文件夹

如何指定列数据类型

使用BeautifulSoup抓取所有链接

如何在Pyplot表中舍入值

Pandas:填充行并删除重复项,但保留不同的值

根据客户端是否正在传输响应来更改基于Flask的API的行为

无法在Spyder上的Pandas中将本地CSV转换为数据帧