Как отсортировать кадр данных панд с помощью значений из нескольких столбцов?

У меня есть следующий кадр данных:

df = pandas.DataFrame([{'c1':3,'c2':10},{'c1':2, 'c2':30},{'c1':1,'c2':20},{'c1':2,'c2':15},{'c1':2,'c2':100}])

Или, в человекочитаемой форме:

   c1   c2
0   3   10
1   2   30
2   1   20
3   2   15
4   2  100

Следующая команда сортировки работает как ожидалось:

df.sort(['c1','c2'], ascending=False)

Вывод:

   c1   c2
0   3   10
4   2  100
1   2   30
3   2   15
2   1   20

Но следующая команда:

df.sort(['c1','c2'], ascending=[False,True])

результаты в

   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10

и это не то, что я ожидаю. Я ожидаю иметь значения в первом столбце, заказанном от самого большого до самого маленького, и если существуют идентичные значения в первом столбце, порядке возрастающими значениями из второго столбца.

Кто-либо знает, почему это не работает как ожидалось?

ДОБАВЛЕННЫЙ

Это - вставка копии:

>>> df.sort(['c1','c2'], ascending=[False,True])
   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10
62
задан 12 July 2013 в 22:15

6 ответов

В моем случае не работал принятый ответ:

<забастовка> f.sort_values (= ["c1", "c2"], возрастая = [Ложь, Верная])

Только, следующее работало как ожидалось:

f = f.sort_values(by=["c1","c2"], ascending=[False, True])
4
ответ дан 31 October 2019 в 14:02

Примечание: Все здесь корректно, просто замените вид -> sort_values () Так, это становится:

 import pandas as pd
 df = pd.read_csv('data.csv')
 df.sort_values(ascending=False,inplace=True)

Относятся к официальному сайту здесь .

1
ответ дан 31 October 2019 в 14:02

Использование sort может привести к предупреждающему сообщению. См. обсуждение github . Таким образом, Вы могли бы хотеть использовать sort_values, документы здесь

Затем, Ваш код может быть похожим на это:

df = df.sort_values(by=['c1','c2'], ascending=[False,True])
24
ответ дан 31 October 2019 в 14:02

dataframe.sort () метод - так мое понимание - удержан от использования у панд> 0.18. Для решения проблемы, необходимо использовать кадр данных sort_values () вместо этого:

f.sort_values(by=["c1","c2"], ascending=[False, True])

вывод похож на это:

    c1  c2
    3   10
    2   15
    2   30
    2   100
    1   20
8
ответ дан 31 October 2019 в 14:02

Я нашел, что это действительно полезно:

df = pd.DataFrame({'A' : range(0,10) * 2, 'B' : np.random.randint(20,30,20)})

# A ascending, B descending
df.sort(**skw(columns=['A','-B']))

# A descending, B ascending
df.sort(**skw(columns=['-A','+B']))

Примечание, что в отличие от стандарта columns=,ascending= аргументы, здесь имена столбцов и их порядок сортировки находятся в том же месте. В результате Ваш код становится намного легче считать и поддержать.

Примечание фактический вызов к .sort неизменен, skw ( орт s kwargs) просто небольшая функция помощника, которая анализирует столбцы и возвращает обычное columns= и ascending= параметры для Вас. Передайте его любой другой вид kwargs, как Вы обычно были бы. Скопировать/вставить следующий код в, например, Ваше локальное utils.py затем забывают об этом и просто используют его как выше.

# utils.py (or anywhere else convenient to import)
def skw(columns=None, **kwargs):
    """ get sort kwargs by parsing sort order given in column name """
    # set default order as ascending (+)
    sort_cols = ['+' + col if col[0] != '-' else col for col in columns]
    # get sort kwargs
    columns, ascending = zip(*[(col.replace('+', '').replace('-', ''), 
                                False if col[0] == '-' else True) 
                               for col in sort_cols])
    kwargs.update(dict(columns=list(columns), ascending=ascending))
    return kwargs
1
ответ дан 31 October 2019 в 14:02

При написании этого кода как файла сценария затем, необходимо будет записать это как это:

df = df.sort(['c1','c2'], ascending=[False,True])
2
ответ дан 31 October 2019 в 14:02

Другие вопросы по тегам:

Похожие вопросы: