比较Pandas Dataframe中共享列值的行组

时间:2016-11-22 13:15:13

标签: python pandas

我有一个包含名称列和数字列的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做到这一点的最佳方法是什么?作为奖励,如果有两个以上具有相同名称的行,我希望将编号最高的行与最低值行进行比较。

1 个答案:

答案 0 :(得分:1)

groupbydiffabs一起使用:

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