【发布时间】:2018-01-29 19:13:36
【问题描述】:
我有两个 pandas DataFrame,如下:
df1 = pd.DataFrame({('Q1', 'SubQ1'):[1, 2, 3], ('Q1', 'SubQ2'):[1, 2, 3], ('Q2', 'SubQ1'):[1, 2, 3]})
df1['ID'] = ['a', 'b', 'c']
df2 = pd.DataFrame({'item_id': ['a', 'b', 'c'], 'url':['a.com', 'blah.com', 'company.com']})
df1:
Q1 Q2 ID
SubQ1 SubQ2 SubQ1
0 1 1 1 a
1 2 2 2 b
2 3 3 3 c
df2:
item_id url
0 a a.com
1 b blah.com
2 c company.com
请注意,df1 的某些列具有分层索引(例如 ('Q1', 'SubQ1')),而某些列仅具有普通索引(例如 ID)。
我想在ID 和item_id 字段上合并这两个数据框。使用:
result = pd.merge(df1, df2, left_on='ID', right_on='item_id')
给予:
(Q1, SubQ1) (Q1, SubQ2) (Q2, SubQ1) (ID, ) item_id url
0 1 1 1 a a a.com
1 2 2 2 b b blah.com
2 3 3 3 c c company.com
如您所见,合并本身工作正常,但 MultiIndex 已丢失并恢复为元组。我尝试使用 pd.MultiIndex.from_tuples 重新创建 MultiIndex,如下所示:
result.columns = pd.MultiIndex.from_tuples(result)
但这会导致item_id 和url 列出现问题,只取其名称的前两个字符:
Q1 Q2 ID i u
SubQ1 SubQ2 SubQ1 t r
0 1 1 1 a a a.com
1 2 2 2 b b blah.com
2 3 3 3 c c company.com
将df2 中的列转换为单元素元组(即('item_id',) 而不仅仅是'item_id')没有区别。
如何合并这两个 DataFrame 并正确保留 MultiIndex?或者,我怎样才能获取合并的结果并返回具有适当 MultiIndex 的列,而不会弄乱 item_id 和 url 列的名称?
【问题讨论】:
-
df1.assign(u=df1.ID.map(df2.set_index('item_id')['url']))适合你吗? -
它适用于这个例子,但在实际情况下,我在
df2中有多个列,我想在连接中引入 - 所以我必须多次执行此操作才能获得每个专栏,我觉得不太理想。