【发布时间】:2019-03-26 18:53:20
【问题描述】:
给定一个 DataFrame df
Value
Category Pool Class
A 1.0 1.0 1
9.0 2
B 1.0 1.0 3
C 1.0 1.0 4
5.0 5
我想将Pool 和Class 的级别转换为不带reset_index 的整数(见下文)。
我尝试使用 get_level_values 和 set_levels 的组合,就像这样
for c in ['Pool', 'Class']:
df.index.set_levels(df.index.get_level_values(c).astype(int), level=c, inplace=True)
然而,这引发了
ValueError: Level values must be unique: [1, 1, 1, 1, 1] on level 1
为了了解会发生什么,我还尝试使用verify_integrity=False。那么
df.index.set_levels(df.index.get_level_values('Class').astype(int),
level='Class', verify_integrity=False, inplace=True)
生产
Value
Category Pool Class
A 1.0 1 1
1 2
B 1.0 1 3
C 1.0 1 4
9 5
而我的目标是获得
Value
Category Pool Class
A 1.0 1 1
9 2
B 1.0 1 3
C 1.0 1 4
5 5
如何正确实现这一目标? get_level_values 和 set_levels 的链接是正确的方法吗?为什么pandas用astype转换后无法正确设置关卡?
我猜你可以使用reset_index 和set_index,但是使用set_levels 方法有什么好处呢?
d = {'Category': str, 'Pool': int, 'Class': int}
df.reset_index(drop=False, inplace=True)
for k, v in d.items():
df[k] = df[k].astype(v)
df.set_index(list(d.keys()), inplace=True)
【问题讨论】:
标签: python pandas dataframe indexing multi-index