使用 pandas 数据框组聚合函数

using pandas dataframe group agg function

有一个数据框,比如说

df

     Country    Continent        PopulationEst

0    Germany    Europe           8.036970e+07

1    Canada     North America    35.239865+07
...

我想创建一个日期框来显示大小(每个大陆的国家数量),以及每个国家/地区估计人口的总和、平均值和标准偏差。

我做了以下事情:

df2 = df.groupby('Continent').agg(['size', 'sum','mean','std'])

但是结果 df2 有多个级别的列,如下所示:

df2.columns

MultiIndex(levels=[['PopulationEst'], ['size', 'sum', 'mean', 'std']],
           labels=[[0, 0, 0, 0], [0, 1, 2, 3]])

如何从列中删除 PopulationEst,以便数据框只有 ['size', 'sum', 'mean', 'std'] 列?

我认为您需要添加 ['PopulationEst'] - agg 使用此列进行聚合:

df2 = df.groupby('Continent')['PopulationEst'].agg(['size', 'sum','mean','std'])

样本:

df = pd.DataFrame({
'Country': ['Germany', 'Germany', 'Canada', 'Canada'], 
'PopulationEst': [8, 4, 35, 50], 
 'Continent': ['Europe', 'Europe', 'North America', 'North America']},
columns=['Country','PopulationEst','Continent'])
print (df)
   Country  PopulationEst      Continent
0  Germany              8         Europe
1  Germany              4         Europe
2   Canada             35  North America
3   Canada             50  North America

df2 = df.groupby('Continent')['PopulationEst'].agg(['size', 'sum','mean','std'])
print (df2)
               size  sum  mean        std
Continent                                
Europe            2   12   6.0   2.828427
North America     2   85  42.5  10.606602

df2 = df.groupby('Continent').agg(['size', 'sum','mean','std'])
print (df2)
              PopulationEst                     
                       size sum  mean        std
Continent                                       
Europe                    2  12   6.0   2.828427
North America             2  85  42.5  10.606602

另一个解决方案是 MultiIndex.droplevel:

df2 = df.groupby('Continent').agg(['size', 'sum','mean','std'])
df2.columns = df2.columns.droplevel(0)
print (df2)
               size  sum  mean        std
Continent                                
Europe            2   12   6.0   2.828427
North America     2   85  42.5  10.606602

我认为这可以满足您的需求:

grouping = {'Continent': ['size'], 'PopEst':['sum', 'mean', 'std']}
df.groupby('Continent').agg(grouping)