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

Python Pandas DataFrame:如何在索引和列的组合上将左侧数据框与第二个数据框合并,python,pandas,dataframe,Python,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

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

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

例如:

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”与数据帧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.merge
pd.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))
尝试使用:

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))

我知道你说你不能将
df2
的索引更改为一列,但是你能将索引更改为包含两列吗?我正在寻找一种不需要更改索引的解决方案。我知道完整索引或列集合上的合并是如何工作的,我想知道是否需要更改,这是大型数据集的内存问题。更改df1上的索引是可以接受的,但我希望这样做时不必使用
pd.merge(df1,df2,on='index')
@pygo,目的是从df2填充['Ext.Value']列,同样在df1中,合并的“index”列被命名为“Ext.index”,所以这对下面的答案没有帮助…我知道你说你不能将
df2
的索引更改为一列,但是你能将索引更改为包含两列吗?我正在寻找一种不需要更改索引的解决方案。我知道完整索引或列集合上的合并是如何工作的,我想知道是否需要更改,这是大型数据集的内存问题。更改df1上的索引是可以接受的,但我希望这样做时不要使用
pd.merge(df1,df2,on='index')
@pygo,目的是从df2填充['Ext.Value']列,同样在df1中,合并的“index”列名为“Ext.index”,所以这无助于回答以下问题……这是可行的。我不知道您可以使用df2.index作为列名,我只需要在最后过滤列名就可以得到预期的结果<代码>df1.merge(df2,how='left',left'u on=['Ext.Index','Ext.Sub'],right'u on=[df2.Index',Sub'])。设置索引(df1.Index)[list(df1.columns)+['Value']。谢谢,这很有效。我不知道您可以使用df2.index作为列名,我只需要在最后过滤列名就可以得到预期的结果<代码>df1.merge(df2,how='left',left'u on=['Ext.Index','Ext.Sub'],right'u on=[df2.Index',Sub'])。设置索引(df1.Index)[list(df1.columns)+['Value']。谢谢