使用pd.Categorical重排DataFrame无效?问题排查
问题描述
原始DataFrame如下:
| Test | WGT |
|---|---|
| TOTO | 5 |
| TATA | 7 |
| TZTZ | 1 |
执行以下代码:
DF['Test'] = pd.Categorical(DF['Test'], categories=["TATA","TZTZ","TOTO"], ordered=True)
执行print(DF)后,DataFrame仍保持原有行顺序,并未按设置的分类规则排列。预期输出应为:
| Test | WGT |
|---|---|
| TATA | 7 |
| TZTZ | 1 |
| TOTO | 5 |
执行print(DF.Test)可以确认分类已成功设置,但DataFrame的行顺序未变、索引也未重置,请问问题出在哪里?
原因与解决方法
- 核心原因:将列转为有序分类(
pd.Categorical)只是给该列定义了排序逻辑规则,不会自动对DataFrame的行进行重新排列。这个操作仅修改了列的数据类型,不会改变原有行的顺序。 - 解决方法:要让DataFrame按照分类顺序排列,需要手动调用
sort_values()方法,基于该分类列排序:
由于DF = DF.sort_values('Test')Test列已经是有序分类,sort_values会严格遵循你指定的["TATA","TZTZ","TOTO"]顺序来重排行。 - 若需要重置索引(去掉原有索引,生成连续的新索引),可以在排序后追加
reset_index(drop=True):DF = DF.sort_values('Test').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者TourEiffel
相关产品推荐
相关产品推荐

