我有一个带有组结构的 pandas 数据框,其中感兴趣的值
val
保证在组内排序。但是,val
中缺少我需要绑定的值。我的数据如下所示:
组ID | id_within_group | 瓦尔 |
---|---|---|
1 | 1 | 3.2 |
1 | 2 | 4.8 |
1 | 3 | 5.2 |
1 | 4 | NaN |
1 | 5 | 7.5 |
2 | 1 | 1.8 |
2 | 2 | 2.8 |
2 | 3 | NaN |
2 | 4 | 5.4 |
2 | 5 | 6.2 |
我现在想要创建一个下限,
max_prev
是当前行之前的行组内的最大值,而 min_next
是当前行之后的行组内的最小值。不可能只前后查看一排,因为可能存在一簇NaN
。我不需要处理组内第一行和最后一行的边缘情况。因此,所需的输出将是
组ID | id_within_group | 瓦尔 | 最大上一个 | 分钟_下一个 |
---|---|---|---|---|
1 | 1 | 3.2 | NaN | 4.8 |
1 | 2 | 4.8 | 3.2 | 5.2 |
1 | 3 | 5.2 | 4.8 | 7.5 |
1 | 4 | NaN | 5.2 | 7.5 |
1 | 5 | 7.5 | 5.2 | NaN |
2 | 1 | 1.8 | NaN | 2.8 |
2 | 2 | 2.8 | 1.8 | 5.4 |
2 | 3 | NaN | 2.8 | 5.4 |
2 | 4 | 5.4 | 2.8 | 6.2 |
2 | 5 | 6.2 | 5.4 | NaN |
我怎样才能以合理快速的方式实现这一目标?
groupby.transform
:
g = df.groupby('group_id')['val']
df['max_prev'] = g.transform(lambda x: x.ffill().shift())
df['min_next'] = g.transform(lambda x: x[::-1].ffill().shift())
如果您的值未排序:
g = df.groupby('group_id')['val']
df['max_prev'] = g.transform(lambda x: x.ffill().cummax().shift())
df['min_next'] = g.transform(lambda x: x[::-1].ffill().cummin().shift())
输出:
group_id id_within_group val max_prev min_next
0 1 1 3.2 NaN 4.8
1 1 2 4.8 3.2 5.2
2 1 3 5.2 4.8 7.5
3 1 4 NaN 5.2 7.5
4 1 5 7.5 5.2 NaN
5 2 1 1.8 NaN 2.8
6 2 2 2.8 1.8 5.4
7 2 3 NaN 2.8 5.4
8 2 4 5.4 2.8 6.2
9 2 5 6.2 5.4 NaN