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

我在包含 1000 多行的数据框中有两列。A 列可以取值 X、Y、None。B 列包含从 50 到 100 的随机数。

每次在 A 列中出现非“无”事件时,都将其视为发生事件 4。因此,A 列中先前的非 None 事件将是发生 3,之前的事件将是发生 2,之前的事件将是发生 1。我想在发生4和发生3之间找到B列的最小值,并检查它是否大于发生2和发生1之间的B列最小值。结果可以作为“YES”或“NO”存储在数据框中的新列中。

http://img3.mukewang.com/629f23020001557902900721.jpg

例如,我需要找到 ROWNUM 14 和 ROWNUM 11 之间的 B 列的最小值,并将其与 ROWNUM 6 和 ROWNUM 3 之间的 B 列的最小值进行比较。接下来我需要比较 ROWNUM 22 和 ROWNUM 14 之间的最小值并将其与 ROWNUM 11 和 ROWNNUM 6 之间的最小值进行比较。


更新:


import numpy as np

import pandas as pd


df = 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'] = 1

df['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,我使用了你的代码,输出如下。

http://img.mukewang.com/629f230e0001e63703810665.jpg

第 22 行和第 14 行之间的最小值为 56,大于第 11 行和第 6 行之间的最小值 54。因此,结果必须为 1,但您的代码生成 0。



小怪兽爱吃肉
浏览 162回答 1
1回答

隔江千里

您可以使用滑动窗口进行比较: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 npimport pandas as pddf = pd.DataFrame([[0, 0]]*24, columns=list('AB'), index=range(1, 25))df.loc[[3, 6, 11, 14, 22], 'A'] = 1df['B'] = np.random.randint(0, 100, size=len(df))print(df)如下所示:    A   B1   0  982   0  993   1  734   0  425   0  766   1  807   0  918   0  409   0  1510  0  5111  1  9312  0  8213  0  7314  1  8615  0  7116  0  8417  0  6218  0  2019  0  5320  0  1221  0  6822  1  9723  0  7424  0  51
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python