web-dev-qa-db-ja.com

Pandas-データフレームgroupby-複数の列の合計を取得する方法

これは簡単なはずですが、どういうわけか機能する解決策を見つけることができませんでした。

pandasデータフレームは次のようになります。

_index col1   col2   col3   col4   col5
0     a      c      1      2      f 
1     a      c      1      2      f
2     a      d      1      2      f
3     b      d      1      2      g
4     b      e      1      2      g
5     b      e      1      2      g
_

col1とcol2でグループ化し、col3とcol4のsum()を取得します。 _Col5_は、データを集計できないため削除できます。

出力は次のようになります。結果のデータフレームに_col3_と_col4_の両方があることに興味があります。 _col1_と_col2_がインデックスの一部であるかどうかは、実際には関係ありません。

_index col1   col2   col3   col4   
0     a      c      2      4          
1     a      d      1      2      
2     b      d      1      2      
3     b      e      2      4      
_

ここに私が試したものがあります:

_df_new = df.groupby(['col1', 'col2'])["col3", "col4"].sum()
_

ただし、それは_col4_の集計結果のみを返します。

ここで迷子になりました。私が見つけたすべての例は、1つの列のみを集約しますが、明らかに問題は発生しません。

15
Axel

applyを使用して

df.groupby(['col1', 'col2'])["col3", "col4"].apply(lambda x : x.astype(int).sum())
Out[1257]: 
           col3  col4
col1 col2            
a    c        2     4
     d        1     2
b    d        1     2
     e        2     4

aggしたい場合

df.groupby(['col1', 'col2']).agg({'col3':'sum','col4':'sum'})
30
WeNYoBen

別の一般的なソリューションは

df.groupby(['col1','col2']).agg({'col3':'sum','col4':'sum'}).reset_index()

これにより、必要な出力が得られます。

4
Prateek Sharma

問題は、_df.col3.dtype_がintまたは数値データ型ではない可能性が高いことです。 groupbyを実行する前にdf.col3 = df.col3.astype(int)を試してください

さらに、groupbyの後に列を選択して、列が集約されているかどうかを確認します。

_df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]]
_
2
A.Kot

上記の答えは私にはうまくいきませんでした。

df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]]

単一のグループ化と合計列でグループ化していました。

これが私のために働いたものです。

D1.groupby(['col1'])['col2'].sum() << The sum at the end not the middle.
1
Leo James