2017-09-26 4 views
0

これは簡単なはずですが、どういうわけか、うまくいく解決策を見つけることができませんでした。パンダ - データフレームgroupby - 複数の列の合計を取得する方法

私はこのようになりますパンダのデータフレームがあります。

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を削除することはできません。

出力は次のようになります。結果のデータフレームにcol3col4の両方を持つことに興味があります。 col1col2が索引の一部であるかどうかは実際問題ではありません。ここで

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つの列のみを集計しています。

+0

問題は 'df.col3.dtype'はそうではないと思われます'int'または数値データ型です。 'groupby'を実行する前に' df.col3 = df.col3.astype(int) 'を試してください –

答えて

3

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

にしたいされている問題は、df.col3.dtypeの可能性が高いintまたは数値データ型ではない可能性が高いです。列がさえ集約されているかどうかを確認するためにGROUPBY後に列を選択し、さらにあなたのgroupby

を行う前にdf.col3 = df.col3.astype(int)をお試しください:

df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]] 
関連する問題