如何使用键对 Pandas DataFrame 进行排序?

Vas*_*h K 4 python pandas

我正在寻找一种对 Pandas DataFrame 进行排序的方法。pd.DataFrame.sort_values不接受按键功能。我可以将它转换为列表并应用一个键来sorted运行,但这会很慢。另一种方式似乎与分类索引有关。我没有固定的行数,所以我不知道分类索引是否适用。

我已经给出了我想要排序的数据类型的示例:

输入数据帧:

     clouds  fluff
0    {[}      1
1    >>>      2
2     {1      3
3    123      4
4  AAsda      5
5    aad      6
Run Code Online (Sandbox Code Playgroud)

输出数据帧:

     clouds  fluff
0    >>>      2
1    {[}      1
2     {1      3
3    123      4
4    aad      6
5  AAsda      5
Run Code Online (Sandbox Code Playgroud)

排序规则(优先级):

  • 第一个特殊字符(按 ascii 排序)

  • 接下来是数字

  • 接下来是小写字母(字典序)

  • 接下来是大写字母(字典序)

在普通的python中,我会这样做

from functools import cmp_to_key

def ks(a, b):
    # "Not exactly this but similar"
    if a.isupper():
        return -1
    else:
        return 1
Run Code Online (Sandbox Code Playgroud)

案件

sorted(['aa', 'AA', 'dd', 'DD'], key=cmp_to_key(ks))
Run Code Online (Sandbox Code Playgroud)

回答:

['DD', 'AA', 'aa', 'dd']
Run Code Online (Sandbox Code Playgroud)

你会如何用 Pandas 做到这一点?

Vas*_*h K 5

从 pandas 1.1.0 开始,pandas.DataFrame.sort_values接受key类型为 callable的参数。

所以在这种情况下,我们将使用:

df.sort_values(by='clouds', key=kf)

哪里kf是对类型 Series 进行操作的关键函数。接受并返回系列。


小智 5

从 pandas 1.2.0 开始,我这样做了

import numpy as np
import pandas as pd

df = pd.DataFrame(['aa', 'dd', 'DD', 'AA'], columns=["data"])

# This is the sorting rule
rule = {
    "DD": 1,
    "AA": 10,
    "aa": 20,
    "dd": 30,
    }


def particular_sort(series):
    """
    Must return one Series
    """
    return series.apply(lambda x: rule.get(x, 1000))


new_df = df.sort_values(by=["data"], key=particular_sort)
print(new_df)  # DD, AA, aa, dd
Run Code Online (Sandbox Code Playgroud)

当然你也可以这样做,但是可能很难理解,笑

new_df = df.sort_values(by=["data"], key=lambda x: x.apply(lambda y: rule.get(y, 1000)))
print(new_df)  # DD, AA, aa, dd
Run Code Online (Sandbox Code Playgroud)