将多级索引的Pandas DataFrame与单级索引的Pandas DataFrame合并

3

我想要合并两个数据框。第一个是多级索引的数据框,而第二个是简单的数据框。

import pandas as pd
import numpy
a = pd.DataFrame({'a': {('x', 0) : 1, ('x', 1) : 2, ('y', 0): 3, ('y', 1): 5}, 'b': {('x', 0) : 2, ('x', 1) : 4, ('y', 0): 2, ('y', 1): 7}}).T
print(a)

#    x     y
#    0  1  0  1
# a  1  2  3  5
# b  2  4  2  7

b = pd.DataFrame({'y': np.arange(10), 'z': np.arange(10, 20)})

magical_merge(left=a, right=b, on='y')

#    x     y     z
#    0  1  0  1  0  1 
# a  1  2  3  5 13 15
# b  2  4  2  7 12 17

现在我正在使用对第二个索引进行循环的方式来完成此操作:

merged = []
for l in [0, 1]:
   m = pd.merge(left=a.xs(l, axis=1, level=1),right=b, on='y')
   m_indices = pd.MultiIndex.from_product([m.columns, [l]])
   m.columns = m_indices
   merged.append(m)

result = pd.concat(merged, axis=1).sort_index(axis=1)

熊猫(pandas)是否能够自行完成这个任务?

所以您想合并与原始数据框中的Y值对应的Z值? - Novice
是的,但我希望在生成的数据框中保留Y值的结构(多级索引)。 - Spark Monkay
1个回答

3
你需要在多索引 df(在你的情况下是 a)上使用 stackreset_index。接下来,合并并使用 set_index 回到原始状态。最后,使用 rename_axis 使多级索引名称更加美观,并使用 unstack 将多级索引列放回原位。
a.stack().reset_index().merge(b, on='y').set_index(['level_0', 'level_1']) \
                       .rename_axis(index=[None, None]).unstack()

Out[335]:
   x     y      z
   0  1  0  1   0   1
a  1  2  3  5  13  15
b  2  4  2  7  12  17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接