如何在不更改其他级别顺序的情况下按一个级别对MultiIndex进行排序

劣质煤

我正在努力根据MultiIndex的一个级别对数据透视表进行排序。我的目标是根据基本有效的值列表对级别中的值进行排序。但我也想保留其他级别的原始顺序。

import pandas as pd
import numpy as np
import random

group_size = 3
n = 10
df = pd.DataFrame({
    'i_a': list(np.arange(0, group_size))*n,
    'i_b': random.choices(list("ARBMC"), k=n*group_size),
    'value': np.random.randint(0, 100, size=n*group_size),
})

pt = pd.pivot_table(
    df,
    index=['i_a', 'i_b'],
    values=['value'],
    aggfunc='sum'
)
# The pivot table looks like this
         value
i_a i_b       
0   A       48
    B       55
    C      161
    M       41
    R      126
1   A       60
    B      236
    C       99
    M       30
    R      202
2   A       22
    B      144
    C       30
    M      146
    R      168

# defined order for i_b
ORDER = {
    "A": 0,
    "R": 1,
    "B": 2,
    "M": 3,
    "C": 4,
}

def order_by_list(value, ascending=True):
    try:
        idx = ORDER[value]
    except KeyError:
        # place items which are not available at the last place
        idx = len(ORDER)
    if not ascending:
        # reverse the order
        idx = -idx
    return idx

def sort_by_ib(df):
    return pt.sort_index(level=["i_b"], 
                         key=lambda index: index.map(order_by_list), 
                         sort_remaining=False
                         )

pt_sorted = pt.pipe(sort_by_ib)

# i_a index of pt_sorted is rearranged what i dont want
         value
i_a i_b       
0   A       48
1   A       60
2   A       22
0   R      126
1   R      202
2   R      168
0   B       55
1   B      236
2   B      144
0   M       41
1   M       30
2   M      146
0   C      161
1   C       99
2   C       30


# Instead, The sorted pivot table should look like this
         value
i_a i_b       
0   A       48
    R      126
    B       55
    M       41
    C      161
1   A       60
    R      202
    B      236
    M       30
    C       99
2   A       22
    R      168
    B      144
    M      146
    C       30

首选/推荐的方法是什么?

耶斯雷尔

如果需要更改顺序,您可以创建用于映射的帮助程序列,添加到中的index参数pivot_table,最后按删除droplevel如果在i_bid_anew级别排序之前添加

df['new'] = df['i_b'].map(ORDER)
pt = pd.pivot_table(
    df,
    index=[ 'i_a','new', 'i_b'],
    values=['value'],
    aggfunc='sum'
).droplevel(1)

print (pt)
         value
i_a i_b       
0   A      217
    R      135
    M      150
    C       43
1   A       44
    R      266
    B       44
    M       13
    C      128
2   A      167
    R        3
    B       85
    M      159
    C       81

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不更改熊猫其他列的情况下对一列进行排序?

如何在一个语句中按多个级别对有角飞镖列表进行排序?

如何在不更改其他元素索引的情况下对数组中的元素进行排序?

如何按子级别中的行数对MultiIndex级别进行排序

如何在不影响具有相同状态的其他元素的情况下更改一个元素的状态?

您知道如何在不更改其他元素顺序的情况下将元素移至第一位置吗?

如何按级别对多维数组排序

如何在不更改相同值红宝石位置的情况下按降序对哈希进行排序

如何在不更改组的内部排列的情况下按三行的组对工作表进行排序

如何在不影响行顺序的情况下按降序对df的每一列进行排序?

如何在不区分大小写的情况下按字母顺序排序?

如何在不删除列表元素的情况下按出现的顺序对列表进行排序?

如何在不使用 OrderedDict 的情况下按字母顺序对嵌套字典进行键排序

如何在不更改主数组原始顺序的情况下通过BOOL快速排序?

如何在不更改其他属性的情况下更改ul中的li文本?

如何在不创建其他变量的情况下修复“创建一个在仍在使用时被释放的临时文件”?

熊猫如何在不丢失其他列信息的情况下进行分组

如何在不更改原始数组的情况下对数组进行排序?

熊猫 如何在不更改索引的情况下对DataFrame进行排序?

如何在不更改查询的情况下对条形图进行排序?

如何在不更改其他行的情况下将页脚放在网格底部?

如何在不更改其他行的情况下将 TableRow 添加到 TableLayout

rollup.js 如何在不更改源文件的情况下导入其他文件

如何在不导入其他模块的情况下更改python中文本的颜色?

如何在Excel中不更改列名的情况下合并一个列下的多个列?

按第一个值对组进行排序而不更改组顺序

按组和级别对多级嵌套列表进行排序

如何在不按Enter的情况下从stdin读取一个字符?

为什么在不设置级别的情况下使用factor()时,输出未按字母顺序排序?