有没有一种方法可以用python更好地执行这项任务?(在2个不同的数据帧中查找if条件)



我是这门语言的新手,我只是想提高我的知识。

考虑到两个不同的dfs,我有以下问题:

df1 = pd.DataFrame({'A':[10, 12, 11, 15, 17, 20, 9, 18, 11, 22, 12, 17, 29, 44, 1]})
df2 = pd.DataFrame({'SCORE_MIN':[0,5,10,15,20,25,30,35,40], 'SCORE_MAX': [5,10,15,20,25,30,35,40,45], 'SCORE':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']})

我只是想在df1中添加一列,根据df2的值"SCORE_MIN"one_answers"SCORE-MAX"分配"SCORE"。要清楚的是,对于df1’10’的第一个元素,考虑到它大于或等于10并且小于15,基于df2分配的分数等于"10";C";。

我未成功尝试np.where:

df1['SCORE'] = np.where(df1['A'] >= df2['SCORE_MIN'] & df1['A'] < df2['SCORE_MAX'], df2['SCORE'], 'NA')

感谢您的支持!

您可以使用merge_asof:

df1 = df1.reset_index().sort_values("A")
res = pd.merge_asof(df1, df2, left_on="A", right_on="SCORE_MIN").set_index("index").sort_index()
print(res)

输出为:

A  SCORE_MIN  SCORE_MAX SCORE
index                                
0      10         10         15     C
1      12         10         15     C
2      11         10         15     C
3      15         15         20     D
4      17         15         20     D
5      20         20         25     E
6       9          5         10     B
7      18         15         20     D
8      11         10         15     C
9      22         20         25     E
10     12         10         15     C
11     17         15         20     D
12     29         25         30     F
13     44         40         45     I
14      1          0          5     A

如果你想在这里使用np.where,你可以这样做:进口熊猫作为pd将numpy导入为np

df1 = pd.DataFrame({'A':[10, 12, 11, 15, 17, 20, 9, 18, 11, 22, 12, 17, 29, 44, 1]})
df2 = pd.DataFrame({'SCORE_MIN':[0,5,10,15,20,25,30,35,40], 'SCORE_MAX': [5,10,15,20,25,30,35,40,45], 'SCORE':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']})
a=df1.A.values
bmax=df2.SCORE_MAX.values
bmin=df2.SCORE_MIN.values
i, j = np.where((a[:, None] >= bmin) & (a[:, None] < bmax))
pd.DataFrame(
np.column_stack([df1.values[i], df2.values[j]]),
columns=df1.columns.append(df2.columns)
)
A SCORE_MIN SCORE_MAX SCORE
0   10        10        15     C
1   12        10        15     C
2   11        10        15     C
3   15        15        20     D
4   17        15        20     D
5   20        20        25     E
6    9         5        10     B
7   18        15        20     D
8   11        10        15     C
9   22        20        25     E
10  12        10        15     C
11  17        15        20     D
12  29        25        30     F
13  44        40        45     I
14   1         0         5     A

最新更新