Pandas 列上的 groupby() 和 agg() 方法混淆

Pandas groupby() and agg() method confusion on columns

我可以看看有什么区别吗

df[['column1', 'column2']].groupby('column1').agg(['mean', 'count'])

df[['column1', 'column2']].groupby('column1').agg({'column2': 'mean', 'column2': 'count'})

在第一个示例中,meancount 是在 column2 上执行的,它不在 groupby.

在第二个示例中,逻辑相同,但我在 agg 中明确提到了 column2

为什么我看不到两者的相同结果?

TLDR

第二个语句的问题必须归因于覆盖列。


至少有三种方法可以做到这一点。

首先让我们构建一个测试数据集:

import pandas as pd
from seaborn import load_dataset

df_tips = load_dataset('tips')

df_tips.head()
声明 1:与您的第一个 wy 相同
df_tips[['sex','size']].groupby(['sex']).agg(['mean','count'])

输出:

            size      
            mean count
sex                   
Male    2.630573   157
Female  2.459770    87

具有多索引列的数据框 header 大小和级别 = 1 两个聚合。

语句 2:在字典中使用 'size' 的聚合列表
df_tips[['sex','size']].groupby(['sex']).agg({'size':['mean','count']})

输出(同上)

            size      
            mean count
sex                   
Male    2.630573   157
Female  2.459770    87
陈述 3:使用 named aggregrations
df_tips[['sex','size']].groupby(['sex']).agg(mean_size=('size','mean'),count_size=('size','count'))

输出:

        mean_size  count_size
sex                          
Male     2.630573         157
Female   2.459770          87

这给出了一个包含您自己命名的 'flatten' 列 header 的数据框,但是该名称不能包含 space 或特殊字符。

不正确方法是你的第二种方法
df_tips[['sex','size']].groupby(['sex']).agg({'size':'mean','size':'count'})

输出:

        size
sex         
Male     157
Female    87

这里发生的事情是你得到两列,每个聚合一个,但列 header 是相同的 'size',因此第一次迭代被第二次 [=58] 覆盖=] 在这种情况下。