[英]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()
从df2
将Company 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.