【发布时间】:2018-10-04 00:45:48
【问题描述】:
我正在尝试合并两个数据框。
我想合并一列,即第二个 DataFrame 的 index 和 一列,即第二个 Dataframe 中的 column。两个 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.merge 或pd.concat 命令执行此操作吗?
通过将 df2.index 变为列来更改 df2?
【问题讨论】:
-
我知道你说你不能把
df2的索引改成一列,但是你能把索引改成包括两列吗? -
我正在寻找一种不需要更改索引的解决方案。我知道完整索引或列集的合并是如何工作的,我想知道是否需要更改,这是大型数据集上的内存问题。更改 df1 上的索引是可以接受的,但我希望不这样做
-
用
pd.merge(df1,df2, on='Index')看看怎么样 -
@pygo,目的是填充 ['Ext. df2 中的 Value'] 列,也在 df1 中,合并的“索引”列被命名为“Ext.Index”,所以这无济于事
-
移到答案下方...