У меня есть следующий кадр данных:
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
В моем случае не работал принятый ответ:
<забастовка> f.sort_values (= ["c1", "c2"], возрастая = [Ложь, Верная]) забастовка>
Только, следующее работало как ожидалось:
f = f.sort_values(by=["c1","c2"], ascending=[False, True])
Примечание: Все здесь корректно, просто замените вид -> sort_values () Так, это становится:
import pandas as pd
df = pd.read_csv('data.csv')
df.sort_values(ascending=False,inplace=True)
Относятся к официальному сайту здесь .
Использование sort
может привести к предупреждающему сообщению. См. обсуждение github . Таким образом, Вы могли бы хотеть использовать sort_values
, документы здесь
Затем, Ваш код может быть похожим на это:
df = df.sort_values(by=['c1','c2'], ascending=[False,True])
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
Я нашел, что это действительно полезно:
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
При написании этого кода как файла сценария затем, необходимо будет записать это как это:
df = df.sort(['c1','c2'], ascending=[False,True])