繁体   English   中英

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

[英]Merging data between two dataframes for multiple columns

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

表格1:

目标公司编号 子公司编号 母公司编号
1个 2个 3个

表 2:

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

对于 Excel,我会进行一系列 Vlookup,但表 1 很大,计算时间很长。 我想生成一个表,例如:

目标公司编号 目标大小 子公司编号 子尺寸 母公司编号 母尺寸
1个 小的 2个 中等的 3个

我试过pd.merge ,但它不像vlookup那样有针对性地为特定列赋值

您可以通过.set_index()df2Company ID映射到Company Size并指定列。

然后,使用.map()df1中的Company ID map(类似查找)到每一列的映射,如下:

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)

结果:

print(df1)

   Target Company ID  Subsidiary ID  Parent Company ID Target Size Subsidiary Size Parent Size
0                  1              2                  3       Small          Medium       Large

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

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)

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

df1 = df1.sort_index(axis=1)

结果:

print(df1)

   Parent Company ID Parent Size  Subsidiary ID Subsidiary Size  Target Company ID Target Size
0                  3       Large              2          Medium                  1       Small

基本你想通过左连接 marge 表 3 次,每次添加不同的列,或者只是将 2 个表视为 3 个表,如下所示

table_1 = #read_file
table_2 = #read_file
targets = table_2[['Target Company ID','Target Size']]
Subsidiarys = table_2[['Subsidiary Company ID','Sub Size']]
Parents = table_2[['Parent Company ID','Parent Size']]
comb_table = pd.merge(table_1,targets,on=['Target Company ID'],how='left')
comb_table = pd.merge(comb_table ,Subsidiarys ,on=['Subsidiary Company ID'],how='left')
comb_table = pd.merge(comb_table ,Parents , on=['Parent Company ID'],how='left')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM