2017-07-06 17 views
2

私は約20列のデータフレームを持っていますが、IDと呼ばれる1列のgroupbyが必要です。 2列。 例DF:Groupby 1列で、パンダの他の2列の差の最大(絶対値)を見つけよう

ID value1 value2 
1  3   2 
1  6   2 
2  6   1 
3  5   8 
4  7   2 
4  3   2 

所望の出力:

ID value1 value2 maxabs 
1  3   2  4 
1  6   2  4 
2  6   1  5 
3  5   8  3 
4  7   2  5 
4  3   2  5 

私はこれを単純に試してみた:

df['maxabs'] = df.groupby(['ID'])[(df['value1'] - df['value2'])].abs().idxmax() 

エラーは列が見つからないことを言った、私に "の多くを印刷しましたnan '。確かに、列はそこにあります。たぶん、両方の値が 'nan'で印刷されるときに追加する必要があります。 しかし私が方向を打つことさえ確信していない。

答えて

3

計算の順序を切り替えます。 IDによってVALUE1VALUE2まず、その後群間の差を計算し、transformmaxを計算する:

df['maxabs'] = df.value1.sub(df.value2).abs().groupby(df.ID).transform('max') 

df 
# ID value1 value2 maxabs 
#0 1  3  2  4 
#1 1  6  2  4 
#2 2  6  1  5 
#3 3  5  8  3 
#4 4  7  2  5 
#5 4  3  2  5 
+1

に慣れ、mergeまたはjoinを使用することができます...ありがとう:) – jovicbg

2

これを試してください。 Ps。あなたはまた、私はちょうどmap

df['maxabs']=df.ID.map(df.groupby(['ID']).apply(lambda x: max(abs(x.value1-x.value2)))) 

    ID value1 value2 maxabs 
0 1  3  2  4 
1 1  6  2  4 
2 2  6  1  5 
3 3  5  8  3 
4 4  7  2  5 
5 4  3  2  5 
関連する問題