从熊猫数据帧中的另一个数据帧获取列元素值的快速方法



我有以下数据帧:

import pandas as pd

df1 = pd.DataFrame({'Col_1': ('a', 'b', 'c'), 'Col_2': ('a', 'c', 'd')})
df2 = pd.DataFrame({'Col_3': ('a', 'b', 'c', 'd'), 'Val': (1, 2, 3, 4)})
df1:
Col_1 Col_2
0     a     a
1     b     c
2     c     d
df2:
Col_3  Val
0     a    1
1     b    2
2     c    3
3     d    4

我正在尝试添加两列来添加 df2 中的 a、b、c 和 d 的值。这是我拥有的代码,但我不确定这是否是针对大型数据集的最有效方法。

df3 = df1.merge(df2, left_on='Col_1', right_on='Col_3').merge(df2, left_on='Col_2', right_on='Col_3')
df3:
Col_1 Col_2 Col_3_x  Val_x Col_3_y  Val_y
0     a     a       a      1       a      1
1     b     c       b      2       c      3
2     c     d       c      3       d      4

如果使用合并足够有效,有没有办法停止复制Col_3_xCol_3_y

感谢您的帮助。

由于联接位于单个列上,因此可以map两次:

s = df2.set_index('Col_3')['Val']  # Use this to map
for col in df1.columns:
df1[f'Val_{col}'] = df1[col].map(s)
print(df1)
Col_1 Col_2  Val_Col_1  Val_Col_2
0     a     a          1          1
1     b     c          2          3
2     c     d          3          4

如果联接在多个列上,则可以使用元组作为键map,尽管创建它们可能会很慢。merge更自然,为了避免重复rename因此两个数据帧中的键相同。

for col in ['Col_1', 'Col_2']:
df1 = df1.merge(df2.rename(columns={'Col_3': col, 'Val': f'Val_{col}'}),
how='left', on=col)

最新更新