Как отсортировать кадр данных 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
Ответы
Ответ 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
Примечание: все здесь правильно, просто замените sort → sort_values() Итак, это становится:
import pandas as pd
df = pd.read_csv('data.csv')
df.sort_values(ascending=False,inplace=True)
Обратитесь к официальному сайту здесь.