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']。谢谢