我有一个包含名称列和数字列的Dataframe。
0 name number
1 a 3
2 a 6
3 b 2
4 b 500
5 c 349
6 c 200
我想要做的是定义一个新列,显示两个具有相同名称的连续行之间的数字差异。这可以输出到比较的第一行即:
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
使用Pandas做到这一点的最佳方法是什么?作为奖励,如果有两个以上具有相同名称的行,我希望将编号最高的行与最低值行进行比较。
答案 0 :(得分:1)
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