对于时间序列数据集:
A,如何找到每个ID的局部最小值(最低值)? (本地分钟)
B,如何找到比每个局部最小值大2的任何后续值。 (本地分钟+ 2)
import pandas as pd
df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,5, 1.5, 3, 1, 1.5, 2, 3, 4, 0.4]})
对于A,我能够使用以下代码从数据集中找到所有的最低/局部最小值,但它们未按每个ID分组。我该如何修改以按ID分组?
nadir_min = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
nadir_min
Out[1]:
4 1.0
8 1.5
10 1.0
Name: value, dtype: float64
对于B,我想在最低点/局部最小值之后返回比最低点/局部最小值大两个值的后续值。对于上面的示例数据,我会回来:
index id value
6 1 3.0
13 2 3.0
14 2 4.0
也许条件循环可以解决问题,因为它可以存储每个局部最小值并比较随后的值(如果它们大于2)。但是,工作数据集非常庞大,运行时间太长,因此我正在尝试以下操作:
df['min_plus2'] = (df['value'] >= nadir_min + 2) & (df.index > nadir_min_index)
答案 0 :(得分:1)
您可以使用下一个代码来完成此操作:
import pandas as pd
import numpy as np
df = pd.DataFrame({'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'value': [8,5,3,2,1,2,3,5, 1.5, 3, 1, 1.5, 2, 3, 4, 0.4]})
df['loc_min'] = df.value[(df.value.shift(1) > df.value) & (df.value.shift(-1) > df.value)]
df['if_A'] = np.where(df['loc_min'].isna(), False, True)
df['loc_min'].fillna(method='ffill', inplace=True)
df['if_B'] = np.where(df['value'] - df['loc_min'] >= 2, True, False)
回答A:
df[df['if_A']==True]
回答B:
df[df['if_B']==True]