gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:15 25 4
gpt4 key购买 nike

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

我的标题看起来像什么:

Header loos like this

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

What the header actually is

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

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

我首先在 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,使用列表然后转换为字典也没有意义。知道如何正确地进行多重索引吗?

最佳答案

不使用 reindex,直接将列设置为新索引:

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

这应该会产生预期的结果。

reindex 不只是替换索引值(尽管这听起来像是它应该做的,而且文档不是特别清楚)。相反,它会遍历您的新索引,选择与新索引匹配的行或列,并在没有旧索引与新索引匹配的地方放置 NaN。这就是你正在发生的事情:当 reindex 命中 ['Foo', 'B'] 时,它在你的原始数据框中不存在,它会填充新数据框中的列带有 NaN 的数据框。

如果您的列始终遵循一致的模式(例如,每三个二级列一个顶级列),您还可以使用 MultiIndex.from_product制作列索引:

iterables = [["Foo", "Bar"], ["A", "B", "C"]]
index = pd.MultiIndex.from_product(iterables)

关于python - 根据另一列的名称重命名 Pandas Multiindex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29081533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com