python - 将 pandas 多索引 DataFrame 的列替换为另一个 DataFrame

标签 python pandas multi-index

我有一个像这样的 pandas DataFrame:

import pandas as pd
import numpy as np

data1 = np.repeat(np.array(range(3), ndmin=2), 3, axis=0)
columns1 = pd.MultiIndex.from_tuples([('foo', 'a'), ('foo', 'b'), ('bar', 'c')])
df1 = pd.DataFrame(data1, columns=columns1)
print(df1)

  foo    bar
    a  b   c
0   0  1   2
1   0  1   2
2   0  1   2

还有一个这样的:

data2 = np.repeat(np.array(range(3, 5), ndmin=2), 3, axis=0)
columns2 = ['d', 'e']
df2 = pd.DataFrame(data2, columns=columns2)
print(df2)

   d  e
0  3  4
1  3  4
2  3  4

现在,我想用 df2 替换 df1 的“bar”,但单级索引的常规语法似乎不起作用:

df1['bar'] = df2
print(df1)

  foo    bar
    a  b   c
0   0  1 NaN
1   0  1 NaN
2   0  1 NaN

当我想要得到的是:

  foo    bar
    a  b   d  e
0   0  1   3  4
1   0  1   3  4
2   0  1   3  4

我不确定我是否在语法上遗漏了某些内容,或者这是否与描述的问题有关 herehere 。有人可以解释为什么这不起作用以及如何获得期望的结果吗?

我正在使用 python 2.7 和 pandas 0.24,如果有区别的话。

最佳答案

由于缺乏更好的选择,我目前正在这样做:

df2.columns = pd.MultiIndex.from_product([['bar'], df2.columns])
df1.drop(columns='bar', level=0, inplace=True)
df1 = df1.join(df2)

这给出了期望的结果。但如果列的顺序很重要,则需要谨慎,因为这种方法可能会改变它。

进一步阅读 Github 上提到的问题,我认为问题中的方法不起作用的原因确实与 pandas API 中尚未修复的不一致有关。

关于python - 将 pandas 多索引 DataFrame 的列替换为另一个 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59569943/

相关文章:

python - 有 PyMedia 的替代品吗

python - Pandas 数据框定位

python - 如何在第二级下删除多索引数据框中的第一列排除某些列

python - 从 Pandas 数据帧创建一个 json 对象

python - 是否有等同于 unittest unittest.TestLoader.loadTestsFromModule() 方法的 Pytest?

python - 我使用 pyinstaller 创建的 .exe 文件适用于 Windows 10,但不适用于 Windows 7

python - 加载夹具时 Django 单元测试出错

python - 如何计算批处理数据帧的平均值?

python - Groupby 保持组间顺序?以何种方式?

python - 满足第一级条件时更改第二级多索引标签