gpt4 book ai didi

python - Pandas set_levels,如何避免标签排序?

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

我在使用多索引的 set_levels 时遇到了问题

from io import StringIO

txt = '''Name,Height,Age
"",Metres,""
A,-1,25
B,95,-1'''

df = pd.read_csv(StringIO(txt),header=[0,1],na_values=['-1',''])

df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)

Name Height Age
Metres
0 A NaN 25.0
1 B 95.0 NaN

如果我再次运行相同的命令

df.columns = df.columns.set_levels(df.columns.get_level_values(level=1).str.replace('Un.*',''),level=1)

Name Height Age
Metres
0 A NaN 25.0
1 B 95.0 NaN

现在这产生了预期的结果。为什么会出现这种行为?是否可以在第一次尝试时让标签保持未排序状态?

最佳答案

我不完全明白为什么会这样,但我找到了导致问题的原因和解决方案:

如果我们查看列标签,我们会发现一些奇怪的东西

>>> df = pd.read_csv(StringIO(txt),header=[0,1],na_values=['-1',''])
>>> df.columns
MultiIndex(levels=[['Age', 'Height', 'Name'], ['Metres', 'Unnamed: 0_level_1', 'Unnamed: 2_level_1']],
labels=[[2, 1, 0], [1, 0, 2]])

第二层的索引与第一层的索引不匹配。当您替换字符串时,您会在 正确 顺序的数组上执行此操作:

>>> df.columns.get_level_values(level=1)
Index(['Unnamed: 0_level_1', 'Metres', 'Unnamed: 2_level_1'], dtype='object')

但是你可以通过索引得到不正确顺序的数组:

>>> df.columns.levels[1]
Index(['Metres', 'Unnamed: 0_level_1', 'Unnamed: 2_level_1'], dtype='object')

因此要删除未命名索引:

>>> df.columns = df.columns.set_levels(df.columns.levels[1].str.replace('Un.*', ''), level=1)
>>> df

Name Height Age
Metres
0 A NaN 25.0
1 B 95.0 NaN

不过,我希望有人指出为什么使用 get_set_levels 会出现这种行为。

关于python - Pandas set_levels,如何避免标签排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48061197/

28 4 0