Python中如何按指定因子层级对pandas DataFrame行重排序
解决方案
两种方案均仅依赖pandas内置功能,无需安装额外第三方库,符合使用要求。
方案1:透视前提前设置有序分类(推荐)
该方案优势为后续所有涉及Size列的分组、透视、排序操作都会默认使用自定义顺序,无需每次单独调整。
import numpy as np import pandas as pd # 原始数据构建 data = {'Item': np.repeat(['Latte', 'Americano', 'Cappuccino'], 3), 'Size': ['Small', 'Medium', 'Large']*3, 'Price': [2.25, 2.60, 2.85, 1.95, 2.25, 2.45, 2.65, 2.95, 3.25] } df = pd.DataFrame(data, columns = ['Item', 'Size', 'Price']) # 自定义Size列的顺序,转换为有序分类类型 size_order = ['Small', 'Medium', 'Large'] df['Size'] = pd.Categorical(df['Size'], categories=size_order, ordered=True) # 执行透视,输出索引自动按自定义顺序排列 df_pivot = pd.pivot_table(df, index = ['Size'], columns = 'Item') print(df_pivot)
输出结果:
Price Item Americano Cappuccino Latte Size Small 1.95 2.65 2.25 Medium 2.25 2.95 2.60 Large 2.45 3.25 2.85
方案2:已有透视结果,直接重排索引
如果已经生成了透视表,不想重新运行全流程,可以直接用reindex方法按自定义顺序重排行索引:
import numpy as np import pandas as pd # 原有透视流程 data = {'Item': np.repeat(['Latte', 'Americano', 'Cappuccino'], 3), 'Size': ['Small', 'Medium', 'Large']*3, 'Price': [2.25, 2.60, 2.85, 1.95, 2.25, 2.45, 2.65, 2.95, 3.25] } df = pd.DataFrame(data, columns = ['Item', 'Size', 'Price']) df_pivot = pd.pivot_table(df, index = ['Size'], columns = 'Item') # 直接按自定义顺序重排索引 size_order = ['Small', 'Medium', 'Large'] df_pivot = df_pivot.reindex(size_order) print(df_pivot)
两种方案输出结果完全一致。
内容的提问来源于stack exchange,提问作者bluesky
相关产品推荐
相关产品推荐

