首页 > 解决方案 > 熊猫:群体之间的差异

问题描述

嗨,我有一个看起来如下所示的熊猫 df(不是真实数据)

index   datedjourney   sequence   values
1       1              1          120
2       1              1          100
3       1              2          75
4       1              3          50
5       1              3          30
6       1              3          61
7       1              4          40
8       1              4          50 
9       2              1          86
10      2              1          40
11      2              2          70

如果我按 datedjourney 和这样的顺序分组

df.groupby(['datedjourney', 'sequence'])['values']

我想计算分组中的最后一行与第二组中的第一行之间的差异,因此df看起来如下所示

index      datedjourney   sequence   values    diff_between_groups
1           1              1          120          NaN
2           1              1          100          NaN
3           1              2          75           -25
4           1              3          50           -25
5           1              3          30           NaN
6           1              3          61           NaN
7           1              4          40           -21
8           1              4          50           NaN
9           2              1          86           NaN
10          2              1          40           NaN
11          2              2          70           30.

所以应该计算第 2 行和第 3 行的值,并且应该将差异存储在第 3 行的新列diff_between_groups中。然后是第 3 行和第 4 行之间的差异等。我不想计算第 8 行之间的差异和 9 因为那是一个新的datedjourney.

标签: pythonpandas

解决方案


创建一个“diff_between_groups”列,它是“values”和“values”之间的差异,移动了一行。

制作一个布尔掩码以查找“datedjourney”相同且“sequence”与上面的行不同的行。

使用 pandas Series where 函数使用掩码替换“diff_between_groups”值。

df = pd.DataFrame({'index': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
                   'datedjourney': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2],
                   'sequence': [1, 1, 2, 3, 3, 3, 4, 4, 1, 1, 2],
                   'values': [120, 100, 75, 50, 30, 61, 40, 50, 86, 40, 70]})

df['diff_between_groups'] = df['values'] - df['values'].shift()
mask = (df.datedjourney == df.datedjourney.shift()) & (df.sequence != df.sequence.shift())
df['diff_between_groups'] = df['diff_between_groups'].where(mask, np.nan)

print(df)

    index  datedjourney  sequence  values  diff_between_groups
0       1             1         1     120                  NaN
1       2             1         1     100                  NaN
2       3             1         2      75                -25.0
3       4             1         3      50                -25.0
4       5             1         3      30                  NaN
5       6             1         3      61                  NaN
6       7             1         4      40                -21.0
7       8             1         4      50                  NaN
8       9             2         1      86                  NaN
9      10             2         1      40                  NaN
10     11             2         2      70                 30.0

推荐阅读