首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫GroupBy有两个列,但都依赖于两个字段/ agg()输出

熊猫GroupBy有两个列,但都依赖于两个字段/ agg()输出
EN

Stack Overflow用户
提问于 2018-03-17 14:03:51
回答 1查看 100关注 0票数 1

晚上好, 我的代码理解了我需要它做的事情,但是我很好奇为什么它会工作。

代码语言:javascript
运行
复制
dft2 = pd.DataFrame(
                        np.array([
                                    ['1','A','WW'], ['1','B','XX'], ['3','A','LL'], ['1','D','ZZ'],['2','A','LL'],['3','E','LL']
                                ]), columns=['channel','state', 'rbc_security_type1']
                  )
display(dft2)


    channel state   rbc_security_type1
0   1         A          WW
1   1         B          XX
2   3         A          LL
3   1         D          ZZ
4   2         A          LL
5   3         E          LL

d = {
        ('state',np.size),
        ('rbc_security_type1',np.size)   
    }

dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index() 
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index() 

dft2_Grp = dft2_Grp.rename(columns={'state':'State_Count', 'rbc_security_type1':'rbc_security_type1_Count'}, level=0) # rename the column header in the groupby
display(dft2_Grp)

现在,这两个聚合产生了相同的输出,我想知道为什么?

代码语言:javascript
运行
复制
dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index() 
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index() 


        channel State_Count rbc_security_type1_Count
    0   1           3               3
    1   2           1               1
    2   3           2               2

当我们应用多列计数时,当我们应用.groupby(‘信道’)column.agg(D)时,究竟发生了什么?D ('state',np.size),(‘rbc_security_type1 1’,np.size)的聚合对我来说是有意义的,但是为什么在agg(d)已经有我想要依赖的两个列的情况下只需要添加一个列?为什么这两列都不需要? 如果我省略了[] (我认为这是有意义的),然后使用下面的命令,我将得到输出:

代码语言:javascript
运行
复制
dft2_Grp = dft2.groupby('channel').agg(d).reset_index(). The output follows:
channel     State_Count                 rbc_security_type1_Count
            state   rbc_security_type1  state   rbc_security_type1
0   1       3           3               3           3
1   2       1           1               1           1
2   3       2           2               2           2

彼得

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-17 14:10:55

您得到相同的输出,因为调用相同的函数两次,每个组的函数返回值的计数。

代码语言:javascript
运行
复制
d = {
        ('state',np.size),
        ('rbc_security_type1',np.size)   
    }

dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index() 

对于每个组的列statechannel返回两个名为staterbc_security_type1的新列,它们具有相同的aggreagte函数np.size

代码语言:javascript
运行
复制
dft2_Grp = dft2.groupby('channel')['rbc_security_type1'].agg(d).reset_index() 

对于每个组的列rbc_security_type1channel返回两个名为staterbc_security_type1的新列,它们具有相同的aggreagte函数np.size

所以更好的方法是使用它,比如:

代码语言:javascript
运行
复制
d = {
        ('a',np.size),
        ('b','first')   
    }

dft2_Grp = dft2.groupby('channel')['state'].agg(d).reset_index() 
print(dft2_Grp)
  channel  a  b
0       1  3  A
1       2  1  A
2       3  2  A

对于列,state通过不同的函数创建新列- first返回每个组的第一个值。

代码语言:javascript
运行
复制
d = {
        'state': np.size,
        'rbc_security_type1':np.size
    }

dft2_Grp = dft2.groupby('channel').agg(d).reset_index() 
print(dft2_Grp)
  channel  state  rbc_security_type1
0       1      3                   3
1       2      1                   1
2       3      2                   2

对于不带元组的聚合字典(更常见)是在dictionary中定义了aggreate函数的列,因此对于state,定义函数np.size,对于rbc_security_type1定义相同:

代码语言:javascript
运行
复制
d = {
        ('a',np.size),
        ('b',np.size)   
    }

dft2_Grp = dft2.groupby('channel').agg(d).reset_index() 
print(dft2_Grp)
  channel state    rbc_security_type1   
              b  a                  b  a
0       1     3  3                  3  3
1       2     1  1                  1  1
2       3     2  2                  2  2

这意味着对于所有列都使用了字典中的所有函数--在这里,双np.size和在列中返回MultiIndex,用于分隔输入列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49337797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档