为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据 B 列中的特定值找到 A 列中一组记录的最小值?

如何根据 B 列中的特定值找到 A 列中一组记录的最小值?

小怪兽爱吃肉 2022-06-07 18:05:35
我在包含 1000 多行的数据框中有两列。A 列可以取值 X、Y、None。B 列包含从 50 到 100 的随机数。每次在 A 列中出现非“无”事件时,都将其视为发生事件 4。因此,A 列中先前的非 None 事件将是发生 3,之前的事件将是发生 2,之前的事件将是发生 1。我想在发生4和发生3之间找到B列的最小值,并检查它是否大于发生2和发生1之间的B列最小值。结果可以作为“YES”或“NO”存储在数据框中的新列中。例如,我需要找到 ROWNUM 14 和 ROWNUM 11 之间的 B 列的最小值,并将其与 ROWNUM 6 和 ROWNUM 3 之间的 B 列的最小值进行比较。接下来我需要比较 ROWNUM 22 和 ROWNUM 14 之间的最小值并将其与 ROWNUM 11 和 ROWNNUM 6 之间的最小值进行比较。更新:import numpy as npimport pandas as pddf = pd.DataFrame([[0, 0]]*100, columns=list('AB'), index=range(1, 101))df.loc[[3, 6, 11, 14, 22, 26, 38, 51, 64, 69, 78, 90, 98], 'A'] = 1df['B'] = np.random.randint(50, 100, size=len(df))df['result'] = df.loc[df['A'] != 0, 'B'].rolling(4).apply(    lambda x: x[-2:].min() > x[:2].min(), raw=True)print(df)df.to_excel("rollingwindow.xlsx",sheet_name="example")a_guest,我使用了你的代码,输出如下。第 22 行和第 14 行之间的最小值为 56,大于第 11 行和第 6 行之间的最小值 54。因此,结果必须为 1,但您的代码生成 0。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以使用滑动窗口进行比较:


result = df.loc[df['A'] != 0, 'B'].rolling(4).apply(

    lambda x: x[-2:].min() > x[:2].min(), raw=True)

如果不应该直接比较非零项,而是应该将它们的位置作为特定范围的边界,那么您可以使用此修改:


result = df.index[df['A'] != 0].to_series().rolling(4).apply(

    lambda x: df.loc[x[2]:x[3], 'B'].min() > df.loc[x[0]:x[1], 'B'].min(), raw=True)

作为参考,这里是示例数据框(使用0forNone和1else,但原理相同):


import numpy as np

import pandas as pd


df = pd.DataFrame([[0, 0]]*24, columns=list('AB'), index=range(1, 25))

df.loc[[3, 6, 11, 14, 22], 'A'] = 1

df['B'] = np.random.randint(0, 100, size=len(df))

print(df)

如下所示:


    A   B

1   0  98

2   0  99

3   1  73

4   0  42

5   0  76

6   1  80

7   0  91

8   0  40

9   0  15

10  0  51

11  1  93

12  0  82

13  0  73

14  1  86

15  0  71

16  0  84

17  0  62

18  0  20

19  0  53

20  0  12

21  0  68

22  1  97

23  0  74

24  0  51



查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信