パンダはグループごとに合計されますが、特定の列は除外されます


88

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

国と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()操作に含める列と除外する列を指定する方法はありますか?

回答:


117

グループの列を選択できます。

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


1
国ごとのレコード数とアイテムコードを別の列として含めるにはどうすればよいですか?
Sushant Kulkarni 2017

グループ化する前に、1を含むダミーの列を作成できます。その後、sumはそれらを合計してカウントを作成します。
マットW.

あなただけの列または2を除外したい場合は、のように、あなたはすべての列名を取得listColumns = list(df.columns)、その後、あなたがしたくない列を削除し、listColumns.remove('Y1964')そして最終的にあなたの合計を実行します。df.groupby(['Country', 'Item_Code'])[listColumns].sum()
ロベルトStelling

どうもありがとう。groupbyを機能させることはできますが、選択部分は機能しません。私が入力した列のリストはデータフレームの中にありますが、ValueErrorが発生し続けます:cannot reindex from a duplicate axis
Bowen Liu

@BowenLiu同じ名前の列が複数ある場合は、このエラーが表示されます。この場合、必要な列を取得するには、iloc toまたはlocを使用する必要があります。これは、groupbyの前に行う必要があると思います。
アンディ・

40

agg機能はあなたのためにこれを行います。列を渡し、列を含むdictとして機能し、出力します。

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})

1
おかげで、これは一般化できますか?Y1961の形式の列がたくさんあるので、次のようなリストを生成します:yrs = ['Y' + str(x)for x in range(1961、2010 + 1、1)]。あなたのソリューションはagg内で「yrs」を使用できますか?
user308827 2015

私はこのアイデアが本当に好きです。秘訣は、値がnumpysum関数であるこのdictを構築することです。逆に、残りのすべての列を合計するだけの場合は、groupby列のすべてがgroupbyステートメントに含まれていれば、元のソリューションが機能します。
leroyJr 2015

11

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

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

df.groupby('Country')[columns].agg('sum')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.