Как отсортировать панд DataFrame с ключом - PullRequest
0 голосов
/ 24 сентября 2018

Я ищу способ сортировки панд DataFrame.pd.DataFrame.sort_values не принимает ключевую функцию.Я могу преобразовать его в список и применить ключ к функции sorted, но это будет медленно.Другой путь кажется чем-то связанным с категориальным индексом.У меня нет фиксированного количества строк, поэтому я не знаю, будет ли применяться категориальный индекс.

Я привел пример того, какие данные я хочу отсортировать:

Фрейм входных данных:

     clouds  fluff
0    {[}      1
1    >>>      2
2     {1      3
3    123      4
4  AAsda      5
5    aad      6

Фрейм выходных данных:

     clouds  fluff
0    >>>      2
1    {[}      1
2     {1      3
3    123      4
4    aad      6
5  AAsda      5

Правило сортировки (приоритет):

  • Первые специальные символы (отсортированы по возрастанию между ними)

  • Далее по номерам

  • следующий алфавит в нижнем регистре (лексикографический)

  • следующий алфавит в верхнем регистре (лексикографический)

На обычном питоне я бы сделал это как

from functools import cmp_to_key

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

Дело

sorted(['aa', 'AA', 'dd', 'DD'], key=cmp_to_key(ks))

Ответ:

['DD', 'AA', 'aa', 'dd']

Как бы вы сделали это с пандами?

1 Ответ

0 голосов
/ 24 сентября 2018

Это может быть полезно, но все же не уверен насчет специальных символов!могут ли они быть фактически отсортированы !!

import pandas as pd

a = [2, 'B', 'c', 1, 'a', 'b',3, 'C', 'A']

df = pd.DataFrame({"a": a})
df['upper'] = df['a'].str.isupper()
df['lower'] = df['a'].str.islower()
df['int'] = df['a'].apply(isinstance,args = [int])

df2 = pd.concat([df[df['int'] == True].sort_values(by=['a']), 
           df[df['lower'] == True].sort_values(by=['a']),
           df[df['upper'] == True].sort_values(by=['a'])])

print(df2)

   a    upper   lower   int
3   1   NaN     NaN     True
0   2   NaN     NaN     True
6   3   NaN     NaN     True
4   a   False   True    False
5   b   False   True    False
2   c   False   True    False
8   A   True    False   False
1   B   True    False   False
7   C   True    False   False

Вы также можете сделать это за один шаг, создав новые столбцы True False!

a = [2, 'B', 'c', 1, 'a', 'b',3, 'C', 'A']
df = pd.DataFrame({"a": a})
df2 = pd.concat([df[df['a'].apply(isinstance,args = [int])].sort_values(by=['a']), 
           df[df['a'].str.islower() == True].sort_values(by=['a']),
           df[df['a'].str.isupper() == True].sort_values(by=['a'])])

    a
3   1
0   2
6   3
4   a
5   b
2   c
8   A
1   B
7   C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...