给定一个数据帧 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)
最佳答案
您可以通过 pd.MultiIndex.levels
直接访问索引级别并提供给 pd.MultiIndex.set_levels
:
df.index = df.index.set_levels(df.index.levels[2].astype(int), level=2)
print(df)
Value
Category Pool Class
A 1.0 1 1
9 2
B 1.0 1 3
C 1.0 1 4
5 5
关于python - 多索引 : Level values must be unique 上的 Pandas set_levels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52933724/