我遇到了一个使用多索引的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现在,这正在产生预期的结果。为甚麽会有这种行为呢?是否有可能在第一次尝试时将标签保持未排序?
发布于 2018-01-02 14:19:19
我不完全理解为什么会发生这种情况,但我找到了问题的原因和解决办法:
如果我们看一下列标签,就会发现一些奇怪的东西。
>>> 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会有这种行为。
发布于 2018-01-02 19:38:18
听起来像是你需要的,这将根据你原来的结构进行修改。
df.rename(columns=lambda x : '' if 'Unnamed' in x else x , level=1)
Out[106]:
Name Height Age
Metres
0 A NaN 25.0
1 B 95.0 NaNhttps://stackoverflow.com/questions/48061197
复制相似问题