基于条件最小值/最低点值过滤数据帧(python/pandas)

2024-09-24 06:23:53 发布

您现在位置:Python中文网/ 问答频道 /正文

对于给定的时间序列数据集,其值与ID相对应:

我想A,找到每个分组id的最小值,然后B,有条件地检查该分组列表是否有大于最小值(minPlus2)的后续值,例如:

df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2], 'value'[8,5,3,2,1,2,3,13,8,5,3,2,1]})

患者ID 1符合值(df.value[6])2大于最小值/最低点值1(df.value[4])2的标准。患者ID 2与标准不匹配,因为在其最低点值(df.value[12])后没有数字。在

到目前为止,我可以使用以下方法找到最低点值:

^{pr2}$

我不知道一种检查B的方法,如果在mins之后有比所识别的mins大2的后续值,如果是的话,则返回到一个单独的变量中。在

理想的输出是那些大于每组最小值2的值。只要是在最小值之后,这些值的索引位置就不重要。在

dfMin = 
id       1
value    1

dfMinPlus2 = 
id       1
value    3

Tags: 数据方法患者iddf列表标准value
2条回答

您可以尝试transform,它类似于groupby,但在聚合后返回带有原始索引的数据

df[df['value'] == df.groupby('id')['value'].transform(np.min) +2]

更新答案

多亏了这番评论,我才得以澄清问题,并想出了解决办法。在

要测试第一个需求(value>;=id+2的最小值),您需要一个系列来保存每个记录的id的最小值。如果您按id对dataframe进行分组并调用value系列的min()方法,这就是结果。您将需要从该系列中删除索引(groupby()方法会扰乱索引)。在

为了满足第二个要求(值出现在最小值的记录之后的记录中),只需使用上面确定的idxmin()方法。这将返回每个记录的id的最小值的一系列索引。在

然后,您可以将dataframe的value系列与第一个系列进行比较,并将dataframe的index与第二个序列进行比较,中间使用一个按位的&运算符,从而获得所需的结果(我认为)。在

import pandas as pd

df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,13,8,5,3,2,1]})

min_value = df.groupby('id')['value'].min()[df['id']]

min_value.reset_index(drop = True, inplace = True)

min_index = df.groupby('id')['value'].idxmin()[df['id']]

df['condition'] = (df['value'] >= min_value + 2) & (df.index > min_index)

结果是在dataframe中生成一个新的序列,它指示给定的记录是否满足所需的条件。在

旧答案:

这个问题仍然有点不清楚(你的理想输出是什么?),但我想到了这个代码,它测试每个id的分组值,以查看是否存在一个值,即最小值的索引之后有两个索引。在

^{pr2}$

有了这个,test_id(1) == Truetest_id(2) == False。在

相关问题 更多 >