python - MultiIndex 上的 Pandas set_levels:级别值必须是唯一的
问题描述
给定一个 DataFramedf
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 - 在 Python 中定义一个函数来反转字符串
- java - 使用从一个类到另一个类的方法
- javascript - 对字符串日期值排序数组未返回正确的结果顺序(降序)
- javascript - 换行后如何获取文本?Javascript
- c - C 编程:如何创建父目录并手动插入文件?
- r - r:如何读取“lmer”中的相关矩阵?
- r - 如何将特定属性作为新行添加到列表中的相应数据框
- postgresql - 如何在 Dropwizard 项目中使用 Postman 上传图像。?
- xslt-3.0 - XSLT - 动态节点名
- laravel - trim() 期望参数 1 是字符串,laravel 中给出的数组