Python 如何根据B列中的特定值查找a列中一组记录的最低值?
我在一个包含1000多行的数据框中有两列。列A可以取值X、Y、None。B列包含从50到100的随机数 每次a列中出现非“无”事件时,都被视为发生4。因此,A列中先前的非无事件将是发生3,在此之前的事件将是发生2,在此之前的事件将是发生1。我想找出发生率4和发生率3之间B列的最小值,并检查它是否大于发生率2和发生率1之间B列的最小值。结果可以作为“是”或“否”存储在数据框中的新列中 样本输入 例如,我需要在ROWNUM 14和ROWNUM 11之间找到列B的最小值,并将其与ROWNUM 6和ROWNUM 3之间的列B的最小值进行比较。接下来,我需要比较ROWNUM 22和ROWNUM 14之间的最小值,并将其与ROWNUM 11和ROWNNUM 6之间的最小值进行比较 更新:Python 如何根据B列中的特定值查找a列中一组记录的最低值?,python,pandas,Python,Pandas,我在一个包含1000多行的数据框中有两列。列A可以取值X、Y、None。B列包含从50到100的随机数 每次a列中出现非“无”事件时,都被视为发生4。因此,A列中先前的非无事件将是发生3,在此之前的事件将是发生2,在此之前的事件将是发生1。我想找出发生率4和发生率3之间B列的最小值,并检查它是否大于发生率2和发生率1之间B列的最小值。结果可以作为“是”或“否”存储在数据框中的新列中 样本输入 例如,我需要在ROWNUM 14和ROWNUM 11之间找到列B的最小值,并将其与ROWNUM 6和R
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")
作为一位客人,我使用了您的代码,输出如下
第22行和第14行之间的最小值为56,大于第11行和第6行之间的最小值54。因此,结果必须是1,但您的代码生成0。您可以使用滑动窗口执行比较:
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)
作为参考,这里是示例数据帧(对于None
使用0
,否则使用1
,但原理相同):
如下所示:
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
请提供可复制的数据,而不是图片。您好,我的问题已添加了更新。你能看一下吗?第22行和第14行之间的最小值是56,大于第11行和第6行之间的最小值54。所以,结果必须是1,但您的代码生成0。@Kartick现在我明白您的意思了,请检查我更新的答案。非常感谢。工作完美。有没有一个地方可以让我学习这些函数并看到更多这样的问题/例子?@Kartick我想说Stackoverflow就是这个地方,看看吧。当然也有,例如,有很多食谱。也许你会在那里找到更多的信息。
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