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'})
在第一个示例中,mean
和 count
是在 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] 覆盖=] 在这种情况下。
我可以看看有什么区别吗
df[['column1', 'column2']].groupby('column1').agg(['mean', 'count'])
和
df[['column1', 'column2']].groupby('column1').agg({'column2': 'mean', 'column2': 'count'})
在第一个示例中,mean
和 count
是在 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] 覆盖=] 在这种情况下。