python:对不同的列应用不同的聚合函数

python:对不同的列应用不同的聚合函数,python,pandas,dataframe,Python,Pandas,Dataframe,我试图理解这个简单SQL语句的等价物是什么: select mykey, sum(Field1) as sum_of_field1, avg(Field1) as avg_field1, min(field2) as min_field2 from df group by mykey 我知道我可以将字典传递给agg()函数: f = {'Field1':'sum', 'Field2':['max','mean'], 'Field3':['min','me

我试图理解这个简单SQL语句的等价物是什么:

select mykey, sum(Field1) as sum_of_field1, avg(Field1) as avg_field1, min(field2) as min_field2
from df
group by mykey
我知道我可以将字典传递给agg()函数:

  f = {'Field1':'sum',
         'Field2':['max','mean'],
         'Field3':['min','mean','count'],
         'Field4':'count'
         }

    grouped = df.groupby('mykey').agg(f)
但是,生成的列名似乎是由pandas自动选择的:
('Field1','sum')

是否有一种方法可以为列名传递字符串,这样字段就不是
('Field1','sum')
,而是我可以选择的内容,比如字段1的sum\u

谢谢。我在这里查看了文档:
但是找不到答案。

对于熊猫0.25,这是可能的

以前不推荐使用的版本如下所示:


例如,您可以将字典字典传递给
.agg
映射
{column:{name:aggfunc}}

In [46]: df.head()
Out[46]:
   Year  qtr  realgdp  realcons  realinvs  realgovt  realdpi  cpi_u      M1  \
0  1950    1   1610.5    1058.9     198.1     361.0   1186.1   70.6  110.20
1  1950    2   1658.8    1075.9     220.4     366.4   1178.1   71.4  111.75
2  1950    3   1723.0    1131.0     239.7     359.6   1196.5   73.2  112.95
3  1950    4   1753.9    1097.6     271.8     382.5   1210.0   74.9  113.93
4  1951    1   1773.5    1122.8     242.9     421.9   1207.9   77.3  115.08

   tbilrate  unemp      pop     infl  realint
0      1.12    6.4  149.461   0.0000   0.0000
1      1.17    5.6  150.260   4.5071  -3.3404
2      1.23    4.6  151.064   9.9590  -8.7290
3      1.35    4.2  151.871   9.1834  -7.8301
4      1.40    3.5  152.393  12.6160 -11.2160

In [47]: df.groupby('qtr').agg({"realgdp": {"mean_gdp": "mean", "std_gdp": "std"},
                                "unemp": {"mean_unemp": "mean"}})
Out[47]:
         realgdp                   unemp
        mean_gdp      std_gdp mean_unemp
qtr
1    4506.439216  2104.195963   5.694118
2    4546.043137  2121.824090   5.686275
3    4580.507843  2132.897955   5.662745
4    4617.592157  2158.132698   5.654902

结果列中有一个多索引。如果您不想使用外部级别,可以使用
.columns.droplevel(0)
我同意这有点令人沮丧,但我确实发现使用
重命名方法链接符合我的目的。另外,当它变得非常复杂时,我将只重置列名。这是一个不可更改的过程,因此您应该能够轻松地处理级别

基于熊猫

生成的聚合是根据函数本身命名的。如果 您需要重命名,然后可以为 像这样的系列

当一个函数有多个用途,并且您希望以不同的方式命名它时,这种删除级别并通过下划线连接不同级别的方法将有所帮助


如果您确实发现了sql语法清理器,那么有一个名为的库可以为您提供这种灵活性。

谢谢!超级有用!你应该把它添加到官方文档中(除非它已经在那里了,我没有找到它),它不在文档中,但是这里有一个问题要正确地记录它:如果你愿意的话,一个添加它的拉取请求会很好!这已经不可能了。Python现在发出一条警告:“不推荐使用带有重命名的dict,并将在将来的版本中删除”。为什么,哦,请有人解释一下为什么!!!!!!
In [46]: df.head()
Out[46]:
   Year  qtr  realgdp  realcons  realinvs  realgovt  realdpi  cpi_u      M1  \
0  1950    1   1610.5    1058.9     198.1     361.0   1186.1   70.6  110.20
1  1950    2   1658.8    1075.9     220.4     366.4   1178.1   71.4  111.75
2  1950    3   1723.0    1131.0     239.7     359.6   1196.5   73.2  112.95
3  1950    4   1753.9    1097.6     271.8     382.5   1210.0   74.9  113.93
4  1951    1   1773.5    1122.8     242.9     421.9   1207.9   77.3  115.08

   tbilrate  unemp      pop     infl  realint
0      1.12    6.4  149.461   0.0000   0.0000
1      1.17    5.6  150.260   4.5071  -3.3404
2      1.23    4.6  151.064   9.9590  -8.7290
3      1.35    4.2  151.871   9.1834  -7.8301
4      1.40    3.5  152.393  12.6160 -11.2160

In [47]: df.groupby('qtr').agg({"realgdp": {"mean_gdp": "mean", "std_gdp": "std"},
                                "unemp": {"mean_unemp": "mean"}})
Out[47]:
         realgdp                   unemp
        mean_gdp      std_gdp mean_unemp
qtr
1    4506.439216  2104.195963   5.694118
2    4546.043137  2121.824090   5.686275
3    4580.507843  2132.897955   5.662745
4    4617.592157  2158.132698   5.654902
In [67]: (grouped['C'].agg([np.sum, np.mean, np.std])
   ....:              .rename(columns={'sum': 'foo',
   ....:                               'mean': 'bar',
   ....:                               'std': 'baz'})
   ....: )
   ....: 
Out[67]: 
          foo       bar       baz
A                                
bar  0.392940  0.130980  0.181231
foo -1.796421 -0.359284  0.912265