【发布时间】: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 级中的列名,那不应该是正确的代码吗?
标签: python excel pandas concat multi-index