根据另一列的名称重命名Pandas Multiindex

时间:2015-03-16 16:06:19

标签: python python-2.7 pandas

我有一个以无法更改的格式生成的CSV文件。该文件在两行上有一个multiindex:标题。当值没有改变时,第一行(更高级别的索引)有空白。

我的标题是什么样的:

Header loos like this

它实际上归结为什么以及我想要什么:

What the header actually is

我希望能够在Python 2.7中使用Pandas正确处理它。

我导致循环索引的第一级,如果值为空,则将其设置为与左侧的相同。

我首先在pandas中加载数据框:

df = pd.read_csv(myFile, header=[0,1], sep=',')
df

Dataframe loaded in Pandas

我尝试了以下内容:

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 

生成非多索引数据框

Flat dataframe

index = pd.MultiIndex.from_tuples(l)
df.reindex(columns = index)

这个给了我正确的索引,但是值消失了。

Disappeared values

我有一种强烈的直觉,我正在尝试的整个方法不是非常pythonic,也没有意义使用列表然后转换为字典。知道如何才能正确地进行多索引吗?

1 个答案:

答案 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)