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

发布于 2025-01-10 10:10:21 字数 467 浏览 0 评论 0原文

之间的区别吗

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

我可以检查一下和

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

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

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

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

Can I check what is the difference between

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

and

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

In the first example, mean and count is performed on column2 which is not in groupby.

In the second example, same logic but I had explicitly mentioned column2 in agg.

Why do I not see the same result for both?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烂人 2025-01-17 10:10:21

TLDR

第二条语句的问题是由于覆盖列造成的。


至少可以通过三种方式来执行此语句。

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

import pandas as pd
from seaborn import load_dataset

df_tips = load_dataset('tips')

df_tips.head()
相同
df_tips[['sex','size']].groupby(['sex']).agg(['mean','count'])

语句 1:与您的第一个 wy输出

            size      
            mean count
sex                   
Male    2.630573   157
Female  2.459770    87

:具有多索引列标题大小和 level=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:使用 命名聚合
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

这给出了一个带有您自己命名的“扁平”列标题的数据框,但是名称不得包含空格或特殊字符。

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

输出:

        size
sex         
Male     157
Female    87

这里发生的情况是,您获得两列,每个聚合各一列,但列标题的“大小”相同,因此在这种情况下,第一次迭代将被第二次“计数”覆盖。

TLDR

The problem with the second statement has to due with overwriting the column.


There are at least three ways to do this statement.

First let's build a test dataset:

import pandas as pd
from seaborn import load_dataset

df_tips = load_dataset('tips')

df_tips.head()
Statement 1: Same as your first wy
df_tips[['sex','size']].groupby(['sex']).agg(['mean','count'])

Output:

            size      
            mean count
sex                   
Male    2.630573   157
Female  2.459770    87

A dataframe with a multiindex column header size and level=1 both aggregations.

Statement 2: Using a list of aggregrations for 'size' in a dictionary
df_tips[['sex','size']].groupby(['sex']).agg({'size':['mean','count']})

Output (same as above)

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

Output:

        mean_size  count_size
sex                          
Male     2.630573         157
Female   2.459770          87

This give a dataframe with a 'flatten' column header that you name yourself, however that name must not contain a space or special characters.

The incorrect way is your second method
df_tips[['sex','size']].groupby(['sex']).agg({'size':'mean','size':'count'})

Outputs:

        size
sex         
Male     157
Female    87

What is happening here is that you are getting two columns one for each aggregations but the column header is the same 'size', therefore the first iteration is getting overwritten with the second 'count' in this case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文