根据条件 minimum/nadir 值 (python/pandas) 过滤数据帧

Filtering dataframe based on conditional minimum/nadir values (python/pandas)

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

我想A,找到每个分组ID的最小值,然后B,有条件地检查该分组列表是否有比最小值大2的后续值(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 大于 minimum/nadir 值 1 (df.value[4]) 的标准。患者 ID 2 不符合标准,因为其最低值后没有数字 (df.value[12])。

到目前为止,我已经能够使用以下方法找到最低点值:

dfMin = df.loc[df.groupby('ID')['value'].idxmin()]

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

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

dfMin = 
id       1
value    1

dfMinPlus2 = 
id       1
value    3

更新的答案

感谢评论,我得以澄清问题并提出解决方案。

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

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

然后您可以将数据帧的 value 系列与第一个系列进行比较,将数据帧的 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)

结果是数据框中的一个新系列,表明给定记录是否满足所需条件。

旧答案:

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

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]})

def test_id(id):
    '''Returns true if there is a value present two indexes after the minimum value, false otherwise'''
    min_index = df.groupby('id').value.idxmin()[id]
    indices = df.groupby('id').indices[id]
    return (min_index + 2) in indices

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

你可以试试 transform,它类似于 groupby 但 returns 聚合后具有原始索引的数据

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