Pandas DataFrame:如何在索引和列的组合上将左侧与第二个数据帧合并



我正在尝试合并两个数据帧。

我想合并到一列,即第二个数据帧的索引和 一列,即第二个数据帧中的一列。两个数据帧中的列/索引名称不同。

例:

import pandas as pd
df2 = pd.DataFrame([(i,'ABCDEFGHJKL'[j], i*2 + j) 
for i in range(10) 
for j in range(10)],
columns = ['Index','Sub','Value']).set_index('Index')
df1 = pd.DataFrame([['SOMEKEY-A',0,'A','MORE'],
['SOMEKEY-B',4,'C','MORE'],
['SOMEKEY-C',7,'A','MORE'],
['SOMEKEY-D',5,'Z','MORE']
], columns=['key', 'Ext. Index', 'Ext. Sub', 'Description']
).set_index('key')

DF1 打印输出

key Ext. Index  Ext. Sub    Description
SOMEKEY-A   0   A   MORE
SOMEKEY-B   4   C   MORE
SOMEKEY-C   7   A   MORE
SOMEKEY-D   5   Z   MORE

DF2 的第一行是

Index   Sub Value
0   A   0
0   B   1
0   C   2
0   D   3
0   E   4

我想将"Ext. Index"和"Ext. Sub"与DataFrame df2合并,其中索引是"Index",列是"Sub">

预期结果是:

key Ext. Index  Ext. Sub    Description Ext. Value
SOMEKEY-A   0   A   MORE    0
SOMEKEY-B   4   C   MORE    10
SOMEKEY-C   7   A   MORE    14
SOMEKEY-D   5   Z   MORE    None

手动,合并工作原理如下

def get_value(x):
try:
return df2[(df2.Sub == x['Ext. Sub']) & 
(df2.index == x['Ext. Index'])]['Value'].iloc[0]
except IndexError:
return None
df1['Ext. Value'] = df1.apply(get_value, axis = 1)

我可以使用pd.mergepd.concat命令执行此操作吗,而无需 通过将 DF2.index 转换为列来更改 DF2?

尝试使用:

df_new = (df1.merge(df2[['Sub', 'Value']],
how='left',
left_on=['Ext. Index', 'Ext. Sub'],
right_on=[df2.index, 'Sub'])
.set_index(df1.index)
.drop('Sub', axis=1))