Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据B列中的特定值查找a列中一组记录的最低值?_Python_Pandas - Fatal编程技术网

Python 如何根据B列中的特定值查找a列中一组记录的最低值?

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

我在一个包含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之间的最小值进行比较

更新:

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