如何在pandas中比较当前行与前n行和后n行?

juzqafwq  于 2023-05-15  发布在  其他
关注(0)|答案(2)|浏览(222)

我想检查当前行的值是否小于前n行以及后n行,并将结果存储在新列中。
例如,我试图得到一个如下的表,其中n=2。

  1. a b
  2. 0 15 False
  3. 1 16 False
  4. 2 13 True
  5. 3 17 False
  6. 4 20 False

先谢谢你。

y1aodyip

y1aodyip1#

有一个使用numpy数组的解决方案,col_name是一个包含值的变量,new_col_name是布尔列的名称:

  1. def checker(df, col_name, new_col_name, n):
  2. vals = df[col_name].to_numpy()
  3. bools = [(vals[i] < vals[max(i - n, 0) : i]).all()
  4. and (vals[i] < vals[i + 1 : min(i + n + 1, vals.size)]).all()
  5. for i in range(vals.size)]
  6. df[new_col_name] = bools
  7. return df
w8f9ii69

w8f9ii692#

我们首先使用滚动窗口计算前一个最小值,然后反转 Dataframe ,并在反转的 Dataframe 上使用滚动计算下一个最小值:

  1. import pandas as pd
  2. df = pd.DataFrame({'value': np.random.randint(0, 100, size=(10))})
  3. n = 2
  4. df['less_than_neighbors'] = False
  5. df_reversed = df[::-1]
  6. df['min_prev'] = df['value'].rolling(window=n, min_periods=n, closed='left').min()
  7. df['min_next'] = df_reversed['value'].rolling(window=n, min_periods=n, closed='left').min()
  8. df.loc[ ( (df['value'] < df['min_prev']) & (df['value'] < df['min_next'])), 'less_than_neighbors'] = True
  9. #df.drop(columns=['min_prev', 'min_next'], inplace=True)
  10. print(df)

相关问题