无法正确组合多索引列(3 级)

Posted

技术标签:

【中文标题】无法正确组合多索引列(3 级)【英文标题】:can't combine multiindex columns properly (3 levels) 【发布时间】:2020-09-08 00:58:31 【问题描述】:

我正在为一些我认为微不足道的事情而苦苦挣扎。我有一个提供以下格式数据的电子表格,很遗憾,这是无法更改的,这是唯一可以提供的方式:

我在一个 jupyter 笔记本中加载 pandas 中的文件,我可以阅读它,指定标题有 3 行,到目前为止一切都很好。关键是因为第二级中的一些标题重复自己(教师、学生、其他),我想将 3 个级别合并为一个,所以我可以轻松识别哪些列做什么。左上角的数据每天都在变化,因此我将那一列重命名为什么都没有('')。我要查找的输出应具有以下列:国家、地区、教师现在、...、perf_teachers_score、...、count_teachers 等。

出于某种原因,pandas 将这个表渲染成这样:

它不会在级别 0 上添加任何未命名的列名占位符,但它会在级别 1 和级别 2 上添加。如果我连接名称,我会得到一些非常难看的列名。我需要连接它们,但在此过程中忽略未命名的那些。我的代码是:

df = pd.read_excel(src, header=[0,1,2])

# to get rid of the date, works as intended
df.columns.set_levels(['', 'perf', 'count'], level=0, inplace=True)
# doesn't work, tells me str has no str method, despite successfully using this function elsewhere
df.columns.set_levels(['' if x.str.contains('unnamed', case=False, na=False) else x for x in df.columns.levels[1].values], level=1, inplace=True)

总之,我做错了什么?如何在没有未命名(和不需要的)标签的情况下连接列名?

谢谢!

【问题讨论】:

set_levels 内的 for 循环中,您仅在级别 1 上进行迭代,因此您应该在级别 0 上执行相同操作以消除那里的未命名索引。 我有点困惑。级别 0 没有任何包含未命名的列。这是我要更改的列名(从 Unnamed... 到 ''),这样当我连接名称时,我会得到可预测和可用的结果。还是我对专栏的理解有问题? 我的错,我切换了级别的顺序(所以 0 表示级别 2) 但是我的代码不应该只替换级别 1 上的列名吗?这就是我的目标,然后我将在第 2 级添加另一行以执行相同的操作。如果我的目标是用 '' 替换第 1 级中的列名,那不应该是正确的代码吗? 检查这个问题:Pandas dataframe with multiindex column - merge levels 【参考方案1】:

知道了……

df.columns = [f'xz' if 'unnamed' in y.lower() else f'xy' if 'unnamed' in z.lower() else f'xyz' for x, y, z in df.columns]

谢谢大卫,你一直很有帮助!

【讨论】:

太棒了!我很高兴你把它整理出来:)

以上是关于无法正确组合多索引列(3 级)的主要内容,如果未能解决你的问题,请参考以下文章

pandas 透视多索引列

枢轴熊猫数据框具有多索引列

Plotly.Express + Pandas 多索引列

加入数据框 - 一个具有多索引列,另一个没有

分配多索引列,同时保留索引级别值的顺序

Groupby 使用字典的多索引列