TLDR; Pandasにgroupby.agg
は、(1)複数の列の集計、および(2)列の複数の集計を指定するための新しい、より簡単な構文があります。したがって、パンダ> = 0.25に対してこれを行うには、次を使用します
df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))
Mean Sum
dummy
1 0.036901 0.369012
または
df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')
Mean Sum
dummy
1 0.036901 0.369012
パンダは、GroupBy.agg
名前付き集計を指定するためのより直感的な構文を優先するように動作を変更しました。参照機能強化の0.25ドキュメントのセクションだけでなく、関連するGitHubの問題GH18366とGH26512を。
ドキュメントから、
出力列名を制御して列固有の集計をサポートするために、pandasはGroupBy.agg()
「名前付き集計」と呼ばれるの特別な構文を受け入れます。
- キーワードは出力列名です
- 値は、最初の要素が選択する列であり、2番目の要素がその列に適用する集計であるタプルです。Pandasはpandas.NamedAggのnamedtupleにフィールド['column'、 'aggfunc']を提供し、引数を明確にします。通常のように、集計は呼び出し可能または文字列エイリアスにすることができます。
キーワード引数を介してタプルを渡すことができるようになりました。タプルはの形式に従います(<colName>, <aggFunc>)
。
import pandas as pd
pd.__version__
# '0.25.0.dev0+840.g989f912ee'
# Setup
df = 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]
})
df.groupby('kind').agg(
max_height=('height', 'max'), min_weight=('weight', 'min'),)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
あるいは、pd.NamedAgg
物事をより明確にする(本質的に名前付きタプル)を使用できます。
df.groupby('kind').agg(
max_height=pd.NamedAgg(column='height', aggfunc='max'),
min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)
max_height min_weight
kind
cat 9.5 7.9
dog 34.0 7.5
Seriesの場合はさらに簡単です。aggfuncをキーワード引数に渡すだけです。
df.groupby('kind')['height'].agg(max_height='max', min_height='min')
max_height min_height
kind
cat 9.5 9.1
dog 34.0 6.0
最後に、列名が有効なPython識別子ではない場合は、アンパックされた辞書を使用します。
df.groupby('kind')['height'].agg(**{'max height': 'max', ...})
パンダ<0.25
0.24までのパンダの最新バージョンでは、集計出力の列名を指定するために辞書を使用すると、次のようになりますFutureWarning
。
df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed
# in a future version
列の名前を変更するための辞書の使用はv0.20で廃止されました。より最近のバージョンのパンダでは、タプルのリストを渡すことでこれをより簡単に指定できます。この方法で関数を指定する場合、その列のすべての関数を(名前、関数)ペアのタプルとして指定する必要があります。
df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})
returns
op1 op2
dummy
1 0.328953 0.032895
または、
df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])
op1 op2
dummy
1 0.328953 0.032895