有没有办法用python更好地执行此任务?(2个不同数据帧中的带if条件的vlookup)
我不熟悉这门语言,我只是想提高我的知识 考虑到两种不同的dfs,我有以下问题:有没有办法用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',
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,这个解决方案对我很有效!非常清楚!谢谢你,罗伊,这个解决方案对我也很有效!非常感谢你。你介意为下一代接受我的答案吗?谢谢你,罗伊,这个解决方案对我也很有效!非常感谢你。你介意为后代接受我的回答吗?