首页 > 解决方案 > 将结果与分组后的前一个结果进行比较

问题描述

我有一个df这样的:

A       B       C       D       E       F
2       a1      a2      a3      a4      100
2       a1      b2      c3      a4      100 # note
2       b1      b2      b3      b4      100
2       c1      c2      c3      c4      100
1       a1      a2      a3      a4      120
2       a1      b2      c3      a4      150 # note
1       b1      b2      b3      b4      130
1       c1      c2      c3      c4      110
0       a1      a2      a3      a4      80

我想比较B-E基于列匹配的 F 列的结果,A如下所示:

A       B       C       D       E       F               diff
2       a1      a2      a3      a4      100             120/100
2       a1      b2      c3      a4      100 # note      150/100
2       b1      b2      b3      b4      100             130/100
2       c1      c2      c3      c4      100             110/100
1       a1      a2      a3      a4      120             80/120
1       a1      b2      c3      a4      150 # note
1       b1      b2      b3      b4      130
1       c1      c2      c3      c4      110
0       a1      a2      a3      a4      80              

由于第一行在我做的第一行中具有相同的A值。1120/100

我试过的:

df.groupby(['B',' 'C', 'D', 'E'])- 这对数据进行了分组,但我不知道如何应用计算 column 先前值的逻辑A。或者也许有一种更简单的方法来实现它。

标签: pythonpandas

解决方案


DataFrameGroupBy.shift与 一起使用Series.div

df['d'] = df.groupby(['B', 'C', 'D', "E"])['F'].shift(-1).div(df['F'])
print (df)
   A   B   C   D   E    F         d
0  2  a1  a2  a3  a4  100  1.200000
1  2  a1  b2  c3  a4  100  1.500000
2  2  b1  b2  b3  b4  100  1.300000
3  2  c1  c2  c3  c4  100  1.100000
4  1  a1  a2  a3  a4  120  0.666667
5  2  a1  b2  c3  a4  150       NaN
6  1  b1  b2  b3  b4  130       NaN
7  1  c1  c2  c3  c4  110       NaN
8  0  a1  a2  a3  a4   80       NaN

推荐阅读