web-dev-qa-db-ja.com

pandasの複数の列でグループ化および集約する方法

私はパンダで次のデータフレームを持っています

 ID     Balance     ATM_drawings    Value
 1      100         50              345 
 1      150         33              233
 2      100         100             333 
 2      100         100             234

希望する形式のデータが必要です

 ID     Balance_mean    Balance_sum     ATM_Drawings_mean    ATM_drawings_sum 
 1      75              250             41.5                 83 
 2      200             100             200                  100

私はパンダでそれを行うために次のコマンドを使用しています

 df1= df[['Balance','ATM_drawings']].groupby('ID', as_index = False).agg(['mean', 'sum']).reset_index()

しかし、それは私が意図したものを提供しません。

6
Neil

辞書を使用して、各シリーズの集計関数を指定できます。

d = {'Balance': ['mean', 'sum'], 'ATM_drawings': ['mean', 'sum']}
res = df.groupby('ID').agg(d)

# flatten MultiIndex columns
res.columns = ['_'.join(col) for col in res.columns.values]

print(res)

    Balance_mean  Balance_sum  ATM_drawings_mean  ATM_drawings_sum
ID                                                                
1            125          250               41.5                83
2            100          200              100.0               200

または、dict.fromkeysdを定義できます。

d = dict.fromkeys(('Balance', 'ATM_drawings'), ['mean', 'sum'])
11
jpp

aggを使用してこれを実現する方法はわかりませんが、「groupby」オブジェクトを再利用して、操作を複数回実行する必要がなく、変換を使用できます。

import pandas as pd

df = pd.DataFrame({
    "ID": [1, 1, 2, 2],
    "Balance": [100, 150, 100, 100],
    "ATM_drawings": [50, 33, 100, 100],
    "Value": [345, 233, 333, 234]
})

gb = df.groupby("ID")
df["Balance_mean"] = gb["Balance"].transform("mean")
df["Balance_sum"] = gb["Balance"].transform("sum")
df["ATM_drawings_mean"] = gb["ATM_drawings"].transform("mean")
df["ATM_drawings_sum"] = gb["ATM_drawings"].transform("sum")
print df

どちらが得られますか:

   ID  Balance  Balance_mean  Balance_sum  ATM_drawings  ATM_drawings_mean  ATM_drawings_sum  Value
0   1      100           125          250            50               41.5                83    345
1   1      150           125          250            33               41.5                83    233
2   2      100           100          200           100              100.0               200    333
3   2      100           100          200           100              100.0               200    234
1
Plasma