web-dev-qa-db-ja.com

グループごとのパンダ合計、ただし特定の列を除外

Pandasデータフレームでgroupbyを実行するのに、そのgroupbyからいくつかの列を除外する最善の方法は何ですか?例えば次のようなデータフレームがあります。

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          Wheat   5312        Ha      10       20      30
2      Afghanistan  25          Maize   5312        Ha      10       20      30
4      Angola       15          Wheat   7312        Ha      30       40      50
4      Angola       25          Maize   7312        Ha      30       40      50

列CountryとItem_Codeをグループ化して、列Y1961、Y1962、およびY1963に該当する行の合計のみを計算します。結果のデータフレームは次のようになります。

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          C3      5312        Ha      20       40       60
4      Angola       25          C4      7312        Ha      60       80      100

今私はこれをやっています:

df.groupby('Country').sum()

ただし、これによりItem_Code列の値も加算されます。 sum()操作に含める列と除外する列を指定する方法はありますか?

66
user308827

グループの列を選択することができます。

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が表示されます。

91
Andy Hayden

agg関数がこれを行います。列を渡し、columnを使って辞書として機能します。

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

これにより、列ごとのグループと指定された集計列のみが表示されます。この例では、 'Y1962'に適用された2つのagg関数を含めました。

期待したものを正確に得るために、グループの他の列をbyで含め、フレーム内のY変数に合計を適用します。

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
32
leroyJr

より一般的な方法で多くの列に適用する場合は、列名のリストを作成し、それをグループ化されたデータフレームのインデックスとして渡すことができます。あなたの場合は、例えば:

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
10
Superstar