根据条件 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) == True
,test_id(2) == False
。
你可以试试 transform,它类似于 groupby 但 returns 聚合后具有原始索引的数据
df[df['value'] == df.groupby('id')['value'].transform(np.min) +2]
对于给定的时间序列数据集,其值对应于 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) == True
,test_id(2) == False
。
你可以试试 transform,它类似于 groupby 但 returns 聚合后具有原始索引的数据
df[df['value'] == df.groupby('id')['value'].transform(np.min) +2]