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

时间:2018-07-25 15:10:25

标签: python pandas dataframe conditional pandas-groupby

对于具有与ID对应的值的给定时间序列数据集:

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

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])的标准。患者ID 2与标准不符,因为其最低值(df.value[12])之后没有数字。

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

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

我不知道一种检查B的方法,如果分钟之后的后续值是否比所确定的分钟大2,并且是否将这些值返回到单独的变量中。

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

dfMin = 
id       1
value    1

dfMinPlus2 = 
id       1
value    3

2 个答案:

答案 0 :(得分:0)

更新后的答案

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

要测试第一个要求(值> = id的最小值+ 2),您需要一个系列,其中包含每个记录的id的最小值。如果按ID对数据帧进行分组并调用value系列的min()方法,则将得到结果。您将需要删除该系列中的索引(groupby()方法将索引弄乱了。)

要满足第二个要求(值出现在最小值记录之后的记录中),只需使用上面确定的idxmin()方法即可。这将为每个记录的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

答案 1 :(得分:0)

您可以尝试转换,就像groupby一样,但是在汇总后返回具有原始索引的数据

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