簡體   English   中英

python pandas:將不同的聚合函數應用於不同的列

[英]python pandas: applying different aggregate functions to different columns

我試圖理解這個簡單的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')但我能選擇的東西,如sum_of_field1?

謝謝。 我查看了這里的文檔: http//pandas.pydata.org/pandas-docs/stable/groupby.html但是找不到答案。

從pandas 0.25開始,這可以通過“命名聚合”來實現

In [79]: animals = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
   ....:                         'height': [9.1, 6.0, 9.5, 34.0],
   ....:                         'weight': [7.9, 7.5, 9.9, 198.0]})
   ....: 

In [80]: animals
Out[80]: 
  kind  height  weight
0  cat     9.1     7.9
1  dog     6.0     7.5
2  cat     9.5     9.9
3  dog    34.0   198.0

In [82]: animals.groupby("kind").agg(
   ....:     min_height=('height', 'min'),
   ....:     max_height=('height', 'max'),
   ....:     average_weight=('weight', np.mean),
   ....: )
   ....: 
Out[82]: 
      min_height  max_height  average_weight
kind                                        
cat          9.1         9.5            8.90
dog          6.0        34.0          102.75

以前棄用的版本如下:


例如,您可以將字典字典傳遞給.agg mapping {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

結果在列中有一個MultiIndex。 如果您不想要該外層,可以使用.columns.droplevel(0)

我同意這有點令人沮喪,但我發現用rename方法進行鏈接符合我的目的。 此外,當它變得非常復雜,我只是將重置列名。 它是一個MultiIndex,所以它是不可變的,你應該感覺很舒服處理關卡。

基於pandas 文檔

生成的聚合以函數本身命名。 如果需要重命名,則可以為此系列添加鏈接操作

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

當有一個功能的倍數用途和您希望以不同的名字,這個問題由下划線下降水平和加入不同程度的幫助。

如果你確實發現sql語法更清晰,那么有一個名為pandasql的庫可以為你提供這種靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM