对于具有与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
答案 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) == True
,test_id(2) == False
。
答案 1 :(得分:0)
您可以尝试转换,就像groupby一样,但是在汇总后返回具有原始索引的数据
df[df['value'] == df.groupby('id')['value'].transform(np.min) +2]