根据第二个数据框中的值从数据框中选择值而不循环

Choose values from a dataframe based on values in a second data frame without looping

下面的最小示例生成了所需的输出,但我真的想在不循环遍历数据帧的情况下执行此操作,因为实际上我使用的数据帧要大得多,这会花费很多时间。

import pandas as pd

data1 = {'SCH_NUMMER': [2, 9, 8, 5], 'h': [9, 8, 7, 6]}
df1 = pd.DataFrame(data=data1)

data2 = {'HAL_HALTNU': [1, 2, 3, 4], 'HAL_VONSCH': [9, 5, 8, 2]}
df2 = pd.DataFrame(data=data2)

for n in df2['HAL_HALTNU']:
    vonsch = df2.loc[df2['HAL_HALTNU'] == n, 'HAL_VONSCH'].iloc[0]
    h1 = df1.loc[df1['SCH_NUMMER'] == vonsch, 'h'].iloc[0]
    print(f"HAL_HALTNU: {n}, h1 = {h1}")

我有两个数据框,其中两列,即 df1['SCH_NUMMER']df2['HAL_VONSCH'],包含相同的值,但顺序不同。
我现在想为 df1['HAL_HALTNU'] 中的每个数字(数据框中的每一行)分配 df1['h'] 中的相应值,例如值 h = 8,对应于 df1['SCH_NUMMER'] == 9,分配给 df2['HAL_VONSCH'] == 9 的行,即分配给 df2['HAL_HALTNU'] == 1。所以我需要从列 'SCH_NUMMER' 和 'HAL_VONSCH' 到 'match' 的值。

这是所需的输出

HAL_HALTNU: 1, h1 = 8
HAL_HALTNU: 2, h1 = 6
HAL_HALTNU: 3, h1 = 7
HAL_HALTNU: 4, h1 = 9

使用merge:

df2['h1'] = df2.merge(df1, left_on='HAL_VONSCH', right_on='SCH_NUMMER', how='left')['h']
print(df2)

# Output
   HAL_HALTNU  HAL_VONSCH  h1
0           1           9   8
1           2           5   6
2           3           8   7
3           4           2   9

map:

df2['h1'] = df2['HAL_VONSCH'].map(df1.set_index('SCH_NUMMER')['h'])
print(df2)

# Output
   HAL_HALTNU  HAL_VONSCH  h1
0           1           9   8
1           2           5   6
2           3           8   7
3           4           2   9