不能正确组合多索引列(3层)

问题描述 投票:1回答:1

我正在努力解决一些我认为相当琐碎的事情。我有一个电子表格,以下面的格式提供数据,不幸的是,这不能改变,这是唯一可以提供的方式。

Spreadsheet format

我在jupyter笔记本的pandas中加载文件,我可以读取它,指定头有3行,到目前为止还不错。重点是,因为二级标题中有些是重复的(教师、学生、其他),所以我想把3个级别合二为一,这样我就可以很容易的识别出哪一列做什么。左上角的数据每天都在变化,因此我将那一列重命名为 "无"。我想要的输出应该有以下几列:国家,地区,teacher_present,..., perf_teachers_core,..., count_teachers等。

由于某些原因,pandas将此表渲染成这样。

data rendered by pandas

它没有在0层添加任何Unnamed列名占位符 但在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)

总而言之,我到底做错了什么? 怎样才能让我的列名连接起来而不出现Unnamed(和不需要的)标签?

谢谢你!我正在为我的一些问题而苦恼,我的代码是:总之,我做错了什么?

python excel pandas concat multi-index
1个回答
1
投票

知道了...

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

谢谢你David,你已经帮了大忙了!

© www.soinside.com 2019 - 2024. All rights reserved.