对多索引数据帧进行排序时如何使用两个关键函数?

问题描述 投票:0回答:1

在 MultiIndex 数据帧上对

df.sort_index()
的调用中,如何使用
func_2
来表示级别
two

func_1 = lambda s: s.str.lower()
func_2 = lambda x: np.abs(x)
m_sorted = df_multi.sort_index(level=['one', 'two'], key=func_1)

文档说“对于多索引输入,密钥应用于每个级别”,这是不明确的。


import pandas as pd
import numpy as np
np.random.seed(3)

# Create multiIndex
choice = lambda a, n: np.random.choice(a, n, replace=True)
df_multi = pd.DataFrame({
    'one': pd.Series(choice(['a', 'B', 'c'], 8)),
    'two': pd.Series(choice([1, -2, 3], 8)),
    'A': pd.Series(choice([2,6,9,7] ,8))
    })
df_multi = df_multi.set_index(['one', 'two'])

# Sort MultiIndex
func_1 = lambda s: s.str.lower()
func_2 = lambda x: np.abs(x)
m_sorted = df_multi.sort_index(level=['one'], key=func_1)
python pandas sorting multi-index
1个回答
0
投票

您可以使用包装函数来映射每个级别名称的排序函数:

def sorter(level):
    return {
      'one': lambda s: s.str.lower(),
      'two': lambda x: np.abs(x)
    }.get(level.name, lambda x: x)(level)

df_multi.sort_index(level=['one', 'two'], key=sorter)

输出:

         A
one two   
a    1   6
    -2   2
     3   7
B    1   6
    -2   7
    -2   7
     3   2
     3   6
© www.soinside.com 2019 - 2024. All rights reserved.