我想合并两个DataFrames,并保持第一帧的索引作为合并数据集的索引.但是,当我执行合并时,生成的DataFrame具有整数索引.如何指定我想保留左数据框的索引?
In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3},
'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})
In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3},
'to_merge_on': {0: 1, 1: 3, 2: 5}})
In [6]: a
Out[6]:
col1 to_merge_on
a 1 1
b 2 3
c 3 4
In [7]: b
Out[7]:
col2 to_merge_on
0 1 1
1 2 3
2 3 5
In [8]: a.merge(b, how='left')
Out[8]:
col1 to_merge_on col2
0 1 1 1.0
1 2 3 2.0
2 3 4 NaN
In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')
Run Code Online (Sandbox Code Playgroud)
编辑:切换到可以轻松复制的示例代码
Wou*_*ire 135
In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
col1 to_merge_on col2
index
a 1 1 1
b 2 3 2
c 3 4 NaN
Run Code Online (Sandbox Code Playgroud)
注意:对于某些左合并操作,如果在a和之间存在多个匹配,则最终可能会有更多行.b您需要进行重复数据删除(重复数据删除文档).这就是为什么pandas不会保留索引的原因.
Mat*_*Son 14
您可以在左侧数据帧上复制索引并进行合并。
a['copy_index'] = a.index
a.merge(b, how='left')
Run Code Online (Sandbox Code Playgroud)
我发现这个简单的方法在处理大型数据帧和使用pd.merge_asof()(或dd.merge_asof())时非常有用。
当重置索引很昂贵(大数据帧)时,这种方法会更好。
df1 = df1.merge(df2, how="inner", left_index=True, right_index=True)
Run Code Online (Sandbox Code Playgroud)
这允许保留 df1 的索引
有一个非pd.merge解决方案。使用map和set_index
In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
Out[1744]:
col1 to_merge_on col2
a 1 1 1.0
b 2 3 2.0
c 3 4 NaN
Run Code Online (Sandbox Code Playgroud)
并且,不要index为索引引入虚拟名称。
小智 5
您也可以使用DataFrame.join()方法来实现相同的目标。该join方法将保留原始索引。可以使用参数指定要连接的列on。
In [17]: a.join(b.set_index("to_merge_on"), on="to_merge_on")
Out[17]:
col1 to_merge_on col2
a 1 1 1.0
b 2 3 2.0
c 3 4 NaN
Run Code Online (Sandbox Code Playgroud)