我有一个以无法更改的格式生成的CSV文件。该文件在两行上有一个multiindex:标题。当值没有改变时,第一行(更高级别的索引)有空白。
我的标题是什么样的:
它实际上归结为什么以及我想要什么:
我希望能够在Python 2.7中使用Pandas正确处理它。
我导致循环索引的第一级,如果值为空,则将其设置为与左侧的相同。
我首先在pandas中加载数据框:
df = pd.read_csv(myFile, header=[0,1], sep=',')
df
我尝试了以下内容:
for i, val in enumerate(df.columns.values):
if val[0][:7] == 'Unnamed':
l.append([l[i-1][0], val[1]])
else:
l.append(val)
我得到的列表“l”似乎是我想要的:
[('Foo', 'A'),
['Foo', 'B'],
['Foo', 'C'],
('Bar', 'A'),
['Bar', 'B'],
['Bar', 'C']]
我试过了两个:
df.columns = l
生成非多索引数据框
index = pd.MultiIndex.from_tuples(l)
df.reindex(columns = index)
这个给了我正确的索引,但是值消失了。
我有一种强烈的直觉,我正在尝试的整个方法不是非常pythonic,也没有意义使用列表然后转换为字典。知道如何才能正确地进行多索引吗?
答案 0 :(得分:3)
不使用reindex
,而是直接将列设置为新索引:
df.columns = pd.MultiIndex.from_tuples(l)
这应该产生预期的结果。
reindex
并不只是替换索引值(虽然这听起来像它应该做的,文档并不是特别清楚)。相反,它会遍历您的新索引,选择与新索引匹配的行或列,并将NaN
放在没有旧索引与新索引匹配的位置。这就是您发生的事情:当reindex
点击['Foo', 'B']
时,原始数据框中不存在NaN
,它会使用{{填充新数据框中的列1}}。
如果您的列始终遵循一致的模式(例如,每三个二级列一个顶级列),您还可以使用MultiIndex.from_product
来创建列索引:
iterables = [["Foo", "Bar"], ["A", "B", "C"]]
index = pd.MultiIndex.from_product(iterables)