有没有办法用python更好地执行此任务?(2个不同数据帧中的带if条件的vlookup)

有没有办法用python更好地执行此任务?(2个不同数据帧中的带if条件的vlookup),python,pandas,Python,Pandas,我不熟悉这门语言,我只是想提高我的知识 考虑到两种不同的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',

我不熟悉这门语言,我只是想提高我的知识

考虑到两种不同的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\u MIN”、“SCORE\u MAX”分配“SCORE”。需要明确的是,对于df1“10”的第一个元素,考虑到它大于或等于10且小于15,基于
df2
分配的分数等于“C”

我尝试了
np,但未成功。其中

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

谢谢你的支持

您可以使用
merge\u 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

您可以使用
merge\u 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
df1=pd.DataFrame({'A':[10,12,11,15,17,20,9,18,11,22,12,17,29,44,1]})
df2=pd.数据帧({'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.值
bmax=df2.SCORE\u最大值
bmin=df2.分数\最小值
i、 j=np.其中((a[:,无]>=bmin)和(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
df1=pd.DataFrame({'A':[10,12,11,15,17,20,9,18,11,22,12,17,29,44,1]})
df2=pd.数据帧({'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.值
bmax=df2.SCORE\u最大值
bmin=df2.分数\最小值
i、 j=np.其中((a[:,无]>=bmin)和(a[:,无]
放置结果数据帧如果df2中有两个重叠的间隔,您希望执行什么操作?或者这是一种不可能的情况?将结果放在DataFrame中如果df2中有两个重叠的间隔,您会怎么做?或者这是一个不可能的情况?谢谢马修,这个解决方案对我很有效!非常清楚!谢谢Mathieu,这个解决方案对我很有效!非常清楚!谢谢你,罗伊,这个解决方案对我也很有效!非常感谢你。你介意为下一代接受我的答案吗?谢谢你,罗伊,这个解决方案对我也很有效!非常感谢你。你介意为后代接受我的回答吗?