根据第二个数据框中的值从数据框中选择值而不循环
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
下面的最小示例生成了所需的输出,但我真的想在不循环遍历数据帧的情况下执行此操作,因为实际上我使用的数据帧要大得多,这会花费很多时间。
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