将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

Posted

技术标签:

【中文标题】将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并【英文标题】:Merge Pandas Multiindexed DataFrame with Singleindexed Pandas DataFrame 【发布时间】:2019-11-10 05:43:19 【问题描述】:

我想加入两个 DataFrame。第一个是多索引 DataFrame,第二个是简单的 DataFrame。

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)

熊猫自己能做到这一点吗?

【问题讨论】:

那么你想合并原始数据帧中Y值对应的Z值吗? 是的,但我想在结果数据帧(多索引)中保留 Y 值的结构 【参考方案1】:

您需要多索引 df 上的 stackreset_index(在您的情况下为 a)。接下来,mergeset_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

【讨论】:

以上是关于将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Pandas 解决方案——例如:使用 numba 或 Cython——使用索引、MultiIndexed DataFrame 来“转换”/“应用”?

两个 pandas MultiIndex 帧将每一行与每一行相乘

在 Pandas 中将两个 MultiIndex 级别合并为一个

使用pandas创建稀疏矩阵,并使用来自.dat文件的其他两列的索引[x,y]的.dat文件的一列中的值填充它

从空格分隔的 .dat 文件中获取日期时间 - python/pandas [重复]

在 pandas 中删除 nan 行的更好方法