熊猫:群体之间的差异

时间:2018-10-18 11:57:37

标签: python pandas

嗨,我有一个熊猫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

如果我按日期分组并按这样的顺序进行分组

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

1 个答案:

答案 0 :(得分:1)

创建一个“ diff_between_groups”列,该列是“值”和“值”之间的偏移量的一行。

使用布尔掩码来查找“ 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