我正在寻找一种对 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 做到这一点?
从 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)
| 归档时间: |
|
| 查看次数: |
6747 次 |
| 最近记录: |