Подтвердить что ты не робот

Как отсортировать кадр данных pandas, используя значения из нескольких столбцов?

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

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

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

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

ADDED

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

>>> df.sort(['c1','c2'], ascending=[False,True])
   c1   c2
2   1   20
3   2   15
1   2   30
4   2  100
0   3   10
4b9b3361

Ответ 1

DataFrame.sort устарела; использовать DataFrame.sort_values.

>>> df.sort_values(['c1','c2'], ascending=[False,True])
   c1   c2
0   3   10
3   2   15
1   2   30
4   2  100
2   1   20
>>> df.sort(['c1','c2'], ascending=[False,True])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ampawake/anaconda/envs/pseudo/lib/python2.7/site-packages/pandas/core/generic.py", line 3614, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'sort'

Ответ 2

Использование sort может привести к предупреждению. См. github обсуждение. Поэтому вы можете использовать sort_values, docs здесь

Тогда ваш код может выглядеть так:

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

Ответ 3

Метод dataframe.sort() - поэтому мое понимание - устарело в pandas > 0.18. Чтобы решить вашу проблему, вы должны использовать dataframe.sort_values ​​():

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

Результат выглядит следующим образом:

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

Ответ 4

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

f.sort_values ​​(by = [ "c1", "c2" ], по возрастанию = [False, True])

Выполнялось только следующее:

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

Ответ 5

Если вы пишете этот код как файл script, тогда вам нужно будет написать его следующим образом:

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

Ответ 6

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

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 (sortkwargs) - это лишь небольшая вспомогательная функция, которая анализирует столбцы и возвращает обычные параметры 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

Ответ 7

Примечание: все здесь правильно, просто замените sortsort_values() Итак, это становится:

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

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