![](/img/trans.png)
[英]how to use different aggregate functions for separate columns in pandas? - python
[英]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.