Pandas2.2 Index objects
Categorical components
方法 | 描述 |
---|---|
CategoricalIndex.codes | 用于获取分类索引中每个元素对应的整数代码 |
CategoricalIndex.categories | 用于获取分类索引中的所有类别(categories) |
CategoricalIndex.ordered | 用于指示分类索引中的类别是否具有有序关系 |
CategoricalIndex.rename_categories(*args, …) | 用于重命名分类索引中的类别 |
CategoricalIndex.reorder_categories(*args, …) | 用于重新排列分类索引中的类别顺序 |
pandas.CategoricalIndex.reorder_categories
pandas.CategoricalIndex.reorder_categories
是 [CategoricalIndex] 对象的一个方法,用于重新排列分类索引中的类别顺序。这个方法允许我们更改 [CategoricalIndex] 中类别的顺序,而不改变数据本身。
详细说明
- 用途:重新排列 [CategoricalIndex] 中的类别顺序
- 参数:
new_categories
:新的类别顺序,必须包含所有现有类别- [ordered](可选):是否将结果设为有序分类,默认为
None
(保持当前状态) inplace
(可选,关键字参数):是否就地修改,默认为False
- 返回值:
- 如果
inplace=False
(默认),返回一个新的 [CategoricalIndex] 对象 - 如果
inplace=True
,就地修改并返回None
- 如果
示例代码及结果
示例 1: 基本用法 - 重新排列类别顺序
import pandas as pd
# 创建一个有序 CategoricalIndex
cat_index = pd.CategoricalIndex(['small', 'large', 'medium', 'small'],
categories=['small', 'medium', 'large'],
ordered=True)
print("原始 CategoricalIndex:")
print(cat_index)
print("原始类别顺序:")
print(cat_index.categories)
# 重新排列类别顺序
reordered_cat_index = cat_index.reorder_categories(['large', 'medium', 'small'])
print("\n重新排列后的 CategoricalIndex:")
print(reordered_cat_index)
print("新类别顺序:")
print(reordered_cat_index.categories)
print("是否有序:", reordered_cat_index.ordered)
输出结果:
原始 CategoricalIndex:
CategoricalIndex(['small', 'large', 'medium', 'small'], categories=['small', 'medium', 'large'], ordered=True, dtype='category')
原始类别顺序:
Index(['small', 'medium', 'large'], dtype='object')
重新排列后的 CategoricalIndex:
CategoricalIndex(['small', 'large', 'medium', 'small'], categories=['large', 'medium', 'small'], ordered=True, dtype='category')
新类别顺序:
Index(['large', 'medium', 'small'], dtype='object')
是否有序: True
示例 2: 更改有序性
import pandas as pd
# 创建一个无序 CategoricalIndex
cat_index = pd.CategoricalIndex(['low', 'high', 'medium', 'low'],
categories=['low', 'medium', 'high'],
ordered=False)
print("原始 CategoricalIndex:")
print(cat_index)
print("是否有序:", cat_index.ordered)
# 重新排列类别并设为有序
ordered_cat_index = cat_index.reorder_categories(['low', 'medium', 'high'], ordered=True)
print("\n重新排列并设为有序后:")
print(ordered_cat_index)
print("是否有序:", ordered_cat_index.ordered)
输出结果:
原始 CategoricalIndex:
CategoricalIndex(['low', 'high', 'medium', 'low'], categories=['low', 'medium', 'high'], ordered=False, dtype='category')
是否有序: False
重新排列并设为有序后:
CategoricalIndex(['low', 'high', 'medium', 'low'], categories=['low', 'medium', 'high'], ordered=True, dtype='category')
是否有序: True
示例 3: 在排序中的应用
import pandas as pd
# 创建一个有序 CategoricalIndex
cat_index = pd.CategoricalIndex(['beginner', 'expert', 'intermediate', 'beginner', 'expert'],
categories=['beginner', 'intermediate', 'expert'],
ordered=True)
print("原始 CategoricalIndex:")
print(cat_index)
# 按不同顺序重新排列类别
reordered_cat = cat_index.reorder_categories(['expert', 'intermediate', 'beginner'])
print("\n重新排列类别后的 CategoricalIndex:")
print(reordered_cat)
# 排序效果会根据新的类别顺序变化
print("\n排序结果:")
print(reordered_cat.sort_values())
输出结果:
原始 CategoricalIndex:
CategoricalIndex(['beginner', 'expert', 'intermediate', 'beginner', 'expert'], categories=['beginner', 'intermediate', 'expert'], ordered=True, dtype='category')
重新排列类别后的 CategoricalIndex:
CategoricalIndex(['beginner', 'expert', 'intermediate', 'beginner', 'expert'], categories=['expert', 'intermediate', 'beginner'], ordered=True, dtype='category')
排序结果:
CategoricalIndex(['expert', 'expert', 'intermediate', 'beginner', 'beginner'], categories=['expert', 'intermediate', 'beginner'], ordered=True, dtype='category')
示例 4: 错误处理 - 类别不匹配
import pandas as pd
# 创建一个 CategoricalIndex
cat_index = pd.CategoricalIndex(['red', 'blue', 'green'],
categories=['red', 'blue', 'green'])
print("原始 CategoricalIndex:")
print(cat_index)
# 尝试使用不完整的类别列表(会抛出异常)
try:
incomplete_reorder = cat_index.reorder_categories(['red', 'blue']) # 缺少 'green'
print(incomplete_reorder)
except ValueError as e:
print(f"\n错误: {e}")
# 尝试使用额外的类别(会抛出异常)
try:
extra_reorder = cat_index.reorder_categories(['red', 'blue', 'green', 'yellow']) # 多出 'yellow'
print(extra_reorder)
except ValueError as e:
print(f"\n错误: {e}")
# 正确的重新排列
correct_reorder = cat_index.reorder_categories(['green', 'blue', 'red'])
print("\n正确的重新排列结果:")
print(correct_reorder)
输出结果:
原始 CategoricalIndex:
CategoricalIndex(['red', 'blue', 'green'], categories=['red', 'blue', 'green'], ordered=False, dtype='category')
错误: items in new_categories are not the same as in old categories
错误: items in new_categories are not the same as in old categories
正确的重新排列结果:
CategoricalIndex(['red', 'blue', 'green'], categories=['green', 'blue', 'red'], ordered=False, dtype='category')
示例 5: 重新排列对数据值的影响
import pandas as pd
# 创建一个 CategoricalIndex
cat_index = pd.CategoricalIndex(['low', 'medium', 'high', 'low', 'medium'],
categories=['low', 'medium', 'high'])
print("原始 CategoricalIndex:")
print(cat_index)
print("值计数:")
print(cat_index.value_counts())
# 重新排列类别顺序
reordered_cat = cat_index.reorder_categories(['high', 'medium', 'low'])
print("\n重新排列类别后的 CategoricalIndex:")
print(reordered_cat)
print("值计数:")
print(reordered_cat.value_counts())
# 注意:数据值本身不变,但类别顺序改变了
print("\n两个索引是否相等:", cat_index.equals(reordered_cat))
输出结果:
原始 CategoricalIndex:
CategoricalIndex(['low', 'medium', 'high', 'low', 'medium'], categories=['low', 'medium', 'high'], ordered=False, dtype='category')
值计数:
low 2
medium 2
high 1
dtype: int64
重新排列类别后的 CategoricalIndex:
CategoricalIndex(['low', 'medium', 'high', 'low', 'medium'], categories=['high', 'medium', 'low'], ordered=False, dtype='category')
值计数:
low 2
medium 2
high 1
dtype: int64
两个索引是否相等: False
应用场景
- 数据可视化:调整类别顺序以改善图表的可读性
- 排序操作:改变排序时的优先级顺序
- 数据展示:按照特定逻辑顺序展示分类数据
- 分析需求:根据分析需要调整类别的重要性顺序
- 报告生成:在报表中按特定顺序展示分类信息
注意事项
- 新的类别列表必须包含所有原始类别,不能多也不能少
- 重新排列类别不会改变数据中的实际值
- 如果使用
inplace=True
,原对象会被修改且方法返回None
- 可以同时更改类别顺序和有序性
- 对于有序分类,类别顺序会影响排序和比较操作的结果
- 重新排列类别后,两个对象在逻辑上可能不相等,即使包含相同的数据
通过 reorder_categories
方法,我们可以灵活地调整 [CategoricalIndex] 中的类别顺序,这对于数据分析和展示非常有用。