Pandasのデータフレームでgroupbyを行い、そのgroupbyからいくつかの列を除外するための最良の方法は何でしょうか? 例えば、以下のようなデータフレームがあります。 ``none Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963 2 アフガニスタン 15 小麦 5312 ha 10 20 30 2 Afghanistan 25 Maize 5312 Ha 10 20 30 4 アンゴラ 15 小麦 7312Ha 30 40 50 4 アンゴラ 25 トウモロコシ 7312 ha 30 40 50
CountryとItem_Codeの列をグループ化し、Y1961、Y1962、Y1963の列に該当する行の合計のみを計算したいと思います。結果のデータフレームは以下のようになります。
``none
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 アフガニスタン 15 C3 5312 Ha 20 40 60
4 アンゴラ 25 C4 7312 Ha 60 80 100
今、私はこのようにしています。
df.groupby('Country').sum()
しかし、これではItem_Code列の値も加算されてしまいます。sum()`の処理に含める列と、除外する列を指定する方法はありますか?
グループビーの列を選択することができます。
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
*渡されるリストはカラムのサブセットでなければならないことに注意してください、さもなければKeyErrorが発生します。
関数 agg
がこれを行ってくれます。 カラムと関数をdictとして渡し、column, output:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
これにより、group by カラムと、指定した集約カラムのみが表示されます。 この例では、 'Y1962'に適用される2つのagg関数を入れました。
期待通りの結果を得るためには、他の列をgroup byに含め、フレーム内のY変数に合計を適用してください。
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})