gpt4 book ai didi

python - 查找另一列中两个条目之间的列的最小值

转载 作者:行者123 更新时间:2023-12-01 00:19:10 25 4
gpt4 key购买 nike

浏览 64 次

0

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

每次在 A 列中出现非“无”的情况时,均被视为出现 4。因此,A 列中前一个非 None 出现的情况将是occurrence3,前一个出现的将是occurrence2,前一个出现的将是occurrence1。我想找到B列occurrence4和occurrence3之间的最小值,并检查它是否大于B列occurrence2和occurrence1之间的最小值。结果可以作为"is"或“否”存储在数据框中的新列中。

示例输入

ROWNUM  A    B
1 None 68
2 None 83
3 X 51
4 None 66
5 None 90
6 Y 81
7 None 81
8 None 100
9 None 83
10 None 78
11 X 68
12 None 53
13 None 83
14 Y 68
15 None 94
16 None 50
17 None 71
18 None 71
19 None 52
20 None 67
21 None 82
22 X 76
23 None 66
24 None 92

例如,我需要找到 ROWNUM 14 和 ROWNUM 11 之间 B 列的最小值,并检查它是否大于 ROWNUM 6 和 ROWNUM 3 之间 B 列的最小值。接下来,我需要找到最小值ROWNUM 22 和 ROWNUM 14 之间的值,并检查它是否大于 ROWNUM 11 和 ROWNNUM 6 之间的最小值,依此类推。

编辑:

在示例数据中,我们从第 14 行开始计算,因为这是 A 列第四次非无出现的位置。第 14 行和第 11 行之间的最小值是 53。第 6 行和第 6 行之间的最小值是 53。 3 是 51。由于 53 > 51, ,这意味着出现 4 和出现 3 之间的 B 列最小值大于出现 2 和出现 1 之间 B 列的最小值。因此,第 14 行的输出将为“YES” “或 1。

接下来,在第 22 行,第 22 行和第 14 行之间的最小值为 50。第 11 行和第 6 行之间的最小值为 68。由于 50 < 68,这意味着出现次数 4 和出现次数 3 之间的最小值不大于出现 2 和出现 1 之间的最小值。因此,第 22 行的输出将为“NO”或 0。

我有以下代码。

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.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)
print(df)

当 A 列具有输入 [0,1] 时,此代码有效。但我需要一个代码,其中 A 列可以包含 [None, X, Y]。此外,此代码生成的输出为 [0,1]。我需要输出为 [YES, NO]。

最佳答案

我阅读了您的示例数据,如下所示:

df = pd.read_fwf('input.txt', widths=[7, 6, 3], na_values=['None'])

注意na_values=['None'],它规定输入中的None(字符串)读作 NaN

这样数据帧是:

    ROWNUM    A    B
0 1 NaN 68
1 2 NaN 83
2 3 X 51
3 4 NaN 66
4 5 NaN 90
5 6 Y 81
6 7 NaN 81
7 8 NaN 100
8 9 NaN 83
9 10 NaN 78
10 11 X 68
11 12 NaN 53
12 13 NaN 83
13 14 Y 69
14 15 NaN 94
15 16 NaN 50
16 17 NaN 71
17 18 NaN 71
18 19 NaN 52
19 20 NaN 67
20 21 NaN 82
21 22 X 76
22 23 NaN 66
23 24 NaN 92

执行任务的代码是:

res = df.index[df.A.notnull()].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)\
.dropna().map(lambda x: 'YES' if x > 0 else 'NO').rename('Result')
df = df.join(res)
df.Result.fillna('', inplace=True)

正如您所看到的,这部分是对您的代码的轻微更改,其中有一些补充。

结果是:

    ROWNUM    A    B Result
0 1 NaN 68
1 2 NaN 83
2 3 X 51
3 4 NaN 66
4 5 NaN 90
5 6 Y 81
6 7 NaN 81
7 8 NaN 100
8 9 NaN 83
9 10 NaN 78
10 11 X 68
11 12 NaN 53
12 13 NaN 83
13 14 Y 69 YES
14 15 NaN 94
15 16 NaN 50
16 17 NaN 71
17 18 NaN 71
18 19 NaN 52
19 20 NaN 67
20 21 NaN 82
21 22 X 76 NO
22 23 NaN 66
23 24 NaN 92

我的解决方案相对于其他解决方案的优点是:

  • 内容可以是 YESNO,如您所愿,
  • 此内容显示 A 列中的非空值,“忽略”前 3 个,它们没有足够的“前辈”。

关于python - 查找另一列中两个条目之间的列的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com