2016-11-22 4 views
1

私は、名前列と数値列を含むデータフレームを持っています。列値を共有するPandas Dataframeの行のグループを比較する

0 name number 
1 a 3 
2 a 6 
3 b 2 
4 b 500 
5 c 349 
6 c 200 

私がしたいのは、同じ名前を持つ2つの連続する行の数値の差異を示す新しい列を定義することです。これを比較の最初の行に出力することができます。

0 name number diff 
1 a 3  3 
2 a 6  N/A 
3 b 2  498 
4 b 500 N/A 
5 c 349 149 
6 c 200 N/A 

パンダを使用してこれを行う最良の方法は何ですか?ボーナスとして、同じ名前の行が3つ以上ある場合は、最も低い値の行と比較して最も高い番号の行が必要です。 diffabs

答えて

1

使用groupby

df['diff'] = df.groupby('name')['number'].diff().abs() 
print (df) 
    0 name number diff 
0 1 a  3 NaN 
1 2 a  6 3.0 
2 3 b  2 NaN 
3 4 b  500 498.0 
4 5 c  349 NaN 
5 6 c  200 149.0 

または:

df['diff'] = df.groupby('name')['number'].diff(-1).abs() 
print (df) 
    0 name number diff 
0 1 a  3 3.0 
1 2 a  6 NaN 
2 3 b  2 498.0 
3 4 b  500 NaN 
4 5 c  349 149.0 
5 6 c  200 NaN 

あなたの他の質問についてはtransformが必要になります。

print (df) 
    0 name number 
0 1 a  3 
1 2 a  6 
2 2 a  8 
3 3 b  2 
4 4 b  500 
5 4 b  600 
6 5 c  349 
7 6 c  200 

df['diff'] = df.groupby('name')['number'].transform(lambda x: x.max() - x.min()) 
print (df) 
    0 name number diff 
0 1 a  3  5 
1 2 a  6  5 
2 2 a  8  5 
3 3 b  2 598 
4 4 b  500 598 
5 4 b  600 598 
6 5 c  349 149 
7 6 c  200 149 

または:

df = df.groupby('name')['number'].apply(lambda x: x.max() - x.min()).reset_index() 
print (df) 
    name number 
0 a  5 
1 b  598 
2 c  149 
+0

あなたの2番目の答えを理解しているかどうかわかりません、もっと説明できますか? – jezrael

+0

あなたは私の質問を正しく理解していません。同じ名前の2つ以上のシーケンシャル行の場合は、最も高い数字が最も低い数字と比較されます。包括的な答えをありがとう。 – GreenGodot

+0

スーパー、お受けいただきありがとうございます! – jezrael

関連する問題