合并两个数据框之间的多列数据

pre*_*per 0 python vlookup python-3.x pandas

我有两个 Excel 电子表格。第一列有多个列,其中三列(名称不同)具有公共数据。我的第二个电子表格包含一个键以及我想要带入第一个电子表格的数据。例如:

表格1:

目标公司ID 子公司ID 母公司 ID
1 2 3

表2:

公司编号 公司规模
1 小的
2 中等的
3 大的

使用 Excel,我会执行一系列 Vlookups,但表 1 很大,需要很长时间才能计算。我想生成一个表,例如:

目标公司ID 目标尺寸 子公司ID 子尺寸 母公司 ID 父级尺寸
1 小的 2 中等的 3 大的

我已经尝试过pd.merge,但它不像为vlookup特定列分配值那样有针对性

Sea*_*ean 5

Company ID您可以进行to Company Sizefrom df2by的映射.set_index()并指定列。

然后,使用.map()映射(如查找)到每列的Company ID映射df1,如下所示:

mapping = df2.drop_duplicates('Company ID').set_index('Company ID')['Company Size']

for col in df1.columns:
    df1[f'{col.split()[0]} Size'] = df1[col].map(mapping)
Run Code Online (Sandbox Code Playgroud)

结果:

print(df1)

   Target Company ID  Subsidiary ID  Parent Company ID Target Size Subsidiary Size Parent Size
0                  1              2                  3       Small          Medium       Large
Run Code Online (Sandbox Code Playgroud)

如果数据框中还有其他列,您可以通过.filter()为所有列名称以 结尾的列选择相关列ID,如下所示:

mapping = df2.drop_duplicates('Company ID').set_index('Company ID')['Company Size']

# select column automatically by `.filter` or enter manually as a list
cols = df1.filter(regex=r'ID$').columns    

for col in cols:
    df1[f'{col.split()[0]} Size'] = df1[col].map(mapping)
Run Code Online (Sandbox Code Playgroud)

如果您想将相关列放在一起,您可以进一步使用.sort_index(),如下所示:

df1 = df1.sort_index(axis=1)
Run Code Online (Sandbox Code Playgroud)

结果:

print(df1)

   Parent Company ID Parent Size  Subsidiary ID Subsidiary Size  Target Company ID Target Size
0                  3       Large              2          Medium                  1       Small
Run Code Online (Sandbox Code Playgroud)