获取pandas数据框中组内的最大先前非缺失值

问题描述 投票:0回答:1

我有一个带有组结构的 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

我怎样才能以合理快速的方式实现这一目标?

python pandas
1个回答
1
投票

您可以使用自定义

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
© www.soinside.com 2019 - 2024. All rights reserved.