Как отсортировать dataframe в pandas
Перейти к содержимому

Как отсортировать dataframe в pandas

  • автор:

Pandas: сортировка DataFrame по индексу и столбцу

Вы можете использовать следующий синтаксис для сортировки pandas DataFrame как по индексу, так и по столбцу:

df = df.sort_values (by = ['column_name', 'index'], ascending = [ False , True ]) 

В следующих примерах показано, как использовать этот синтаксис на практике.

Примеры: сортировка DataFrame как по индексу, так и по столбцу

В следующем коде показано, как отсортировать кадр данных pandas по столбцу с именем points , а затем по столбцу индекса :

import pandas as pd #create DataFrame df = pd.DataFrame().set_index('id') #view first few rows df.head () points assists rebounds id 1 25 5 11 2 15 7 8 3 15 7 10 4 14 9 6 5 20 12 6 #sort by points and then by index df.sort_values (by = ['points', 'id'], ascending = [ False , True ]) points assists rebounds id 8 29 4 12 1 25 5 11 7 25 9 9 5 20 12 6 6 20 9 5 2 15 7 8 3 15 7 10 4 14 9 6 

Полученный DataFrame сортируется по количеству очков в порядке убывания, а затем по индексу в порядке возрастания (если два игрока набрали одинаковое количество очков).

Обратите внимание, что если мы не используем возрастающий аргумент, то каждый столбец будет использовать возрастание в качестве метода сортировки по умолчанию:

#sort by points and then by index df.sort_values (by = ['points', 'id']) points assists rebounds id 4 14 9 6 2 15 7 8 3 15 7 10 5 20 12 6 6 20 9 5 1 25 5 11 7 25 9 9 8 29 4 12 

Если столбец индекса в настоящее время не имеет имени, вы можете переименовать его, а затем отсортировать соответствующим образом:

#sort by points and then by index df.rename_axis('index'). sort_values (by = ['points', 'id']) points assists rebounds id 4 14 9 6 2 15 7 8 3 15 7 10 5 20 12 6 6 20 9 5 1 25 5 11 7 25 9 9 8 29 4 12 

Pandas: как сортировать DataFrame по алфавиту

Вы можете использовать следующие методы для сортировки строк кадра данных pandas в алфавитном порядке:

Способ 1: сортировка по одному столбцу в алфавитном порядке

#sort A to Z df.sort_values('column1') #sort Z to A df.sort_values('column1', ascending= False ) 

Способ 2: сортировка по нескольким столбцам в алфавитном порядке

#sort by column1 from Z to A, then by column2 from A to Z df.sort_values(['column1', 'column2'], ascending=( False , True )) 

В следующем примере показано, как использовать каждый метод на практике.

Пример 1. Сортировка по одному столбцу в алфавитном порядке

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame print(df) team points 0 Mavs 120 1 Spurs 108 2 Lakers 99 3 Nuggets 104 4 Hawks 115 

Мы можем использовать следующий синтаксис для сортировки строк DataFrame по имени команды от A до Z :

#sort by team name A to Z df_sorted = df.sort_values('team') #view sorted DataFrame print(df_sorted) team points 4 Hawks 115 2 Lakers 99 0 Mavs 120 3 Nuggets 104 1 Spurs 108 

Обратите внимание, что строки теперь отсортированы по названию команды от А до Я.

Мы также можем отсортировать от Z до A :

#sort by team name Z to A df_sorted = df.sort_values('team', ascending= False ) #view sorted DataFrame print(df_sorted) team points 1 Spurs 108 3 Nuggets 104 0 Mavs 120 2 Lakers 99 4 Hawks 115 

И мы также могли бы использовать функцию reset_index() для сброса значений индекса в отсортированном DataFrame:

#sort by team name A to Z and reset index df_sorted = df.sort_values('team'). reset_index(drop= True ) #view sorted DataFrame print(df_sorted) team points 0 Hawks 115 1 Lakers 99 2 Mavs 120 3 Nuggets 104 4 Spurs 108 

Пример 2. Сортировка по нескольким столбцам в алфавитном порядке

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame print(df) conference team points 0 West Mavs 120 1 West Spurs 108 2 West Lakers 99 3 East Heat 104 4 East Hawks 115 

Мы можем использовать следующий синтаксис для сортировки строк DataFrame по названию конференции от A до Z, а затем по названию команды от Z до A:

#sort by conference name A to Z, then by team name Z to A df_sorted = df.sort_values(['conference', 'team'], ascending=( True , False )) #view sorted DataFrame print(df_sorted) conference team points 3 East Heat 104 4 East Hawks 115 1 West Spurs 108 0 West Mavs 120 2 West Lakers 99 

Строки сортируются по названию конференции от А до Я, а затем по названию команды от Я до А.

Примечание.Полную документацию по функции sort_values() в pandas можно найти здесь .

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в pandas:

pandas.DataFrame.sort_values#

Sort ascending vs. descending. Specify list for multiple sort orders. If this is a list of bools, must match the length of the by.

inplace bool, default False

If True, perform operation in-place.

Choice of sorting algorithm. See also numpy.sort() for more information. mergesort and stable are the only stable algorithms. For DataFrames, this option is only applied when sorting on a single column or label.

na_position , default ‘last’

Puts NaNs at the beginning if first ; last puts NaNs at the end.

ignore_index bool, default False

If True, the resulting axis will be labeled 0, 1, …, n — 1.

key callable, optional

Apply the key function to the values before sorting. This is similar to the key argument in the builtin sorted() function, with the notable difference that this key function should be vectorized. It should expect a Series and return a Series with the same shape as the input. It will be applied to each column in by independently.

Returns : DataFrame or None

DataFrame with sorted values or None if inplace=True .

Sort a DataFrame by the index.

Similar method for a Series.

>>> df = pd.DataFrame( . 'col1': ['A', 'A', 'B', np.nan, 'D', 'C'], . 'col2': [2, 1, 9, 8, 7, 4], . 'col3': [0, 1, 9, 4, 2, 3], . 'col4': ['a', 'B', 'c', 'D', 'e', 'F'] . >) >>> df col1 col2 col3 col4 0 A 2 0 a 1 A 1 1 B 2 B 9 9 c 3 NaN 8 4 D 4 D 7 2 e 5 C 4 3 F 
>>> df.sort_values(by=['col1']) col1 col2 col3 col4 0 A 2 0 a 1 A 1 1 B 2 B 9 9 c 5 C 4 3 F 4 D 7 2 e 3 NaN 8 4 D 

Sort by multiple columns

>>> df.sort_values(by=['col1', 'col2']) col1 col2 col3 col4 1 A 1 1 B 0 A 2 0 a 2 B 9 9 c 5 C 4 3 F 4 D 7 2 e 3 NaN 8 4 D 
>>> df.sort_values(by='col1', ascending=False) col1 col2 col3 col4 4 D 7 2 e 5 C 4 3 F 2 B 9 9 c 0 A 2 0 a 1 A 1 1 B 3 NaN 8 4 D 

Putting NAs first

>>> df.sort_values(by='col1', ascending=False, na_position='first') col1 col2 col3 col4 3 NaN 8 4 D 4 D 7 2 e 5 C 4 3 F 2 B 9 9 c 0 A 2 0 a 1 A 1 1 B 

Sorting with a key function

>>> df.sort_values(by='col4', key=lambda col: col.str.lower()) col1 col2 col3 col4 0 A 2 0 a 1 A 1 1 B 2 B 9 9 c 3 NaN 8 4 D 4 D 7 2 e 5 C 4 3 F 

Natural sort with the key argument, using the natsort package.

>>> df = pd.DataFrame( . "time": ['0hr', '128hr', '72hr', '48hr', '96hr'], . "value": [10, 20, 30, 40, 50] . >) >>> df time value 0 0hr 10 1 128hr 20 2 72hr 30 3 48hr 40 4 96hr 50 >>> from natsort import index_natsorted >>> df.sort_values( . by="time", . key=lambda x: np.argsort(index_natsorted(df["time"])) . ) time value 0 0hr 10 3 48hr 40 2 72hr 30 4 96hr 50 1 128hr 20 

Как сортировать мультииндексы (MultiIndex) в Pandas

Для сортировки MultiIndex необходимо указать все уровни, которые будут использоваться для сортировки. Иначе появиться ошибку типа:

ValueError: The column label ‘Depth’ is not unique.
For a multi-index, the label must be a tuple with elements corresponding to each level.

Шаг 1: Создание многоиндексного DataFrame

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

Magnitude Type Depth Magnitude
MB 100.0 5.6
MWC 10.0 5.5
MWW 21.0 6.0
MWC 35.0 5.5
MWB 45.0 5.6

Для этого DataFrame мы хотим сгруппировать данные по ‘Magnitude Type’ и получить среднее значение, количество и сумму для столбцов — ‘Depth’, ‘Magnitude’.

df_multi = df.groupby(['Magnitude Type'])[['Depth', 'Magnitude']].agg(['mean', 'count', 'sum'])
Depth Magnitude
mean count sum mean count sum
Magnitude Type
MB 81.579365 3761 306819.990 5.682957 3761 21373.60
MD 21.670000 6 130.020 5.966667 6 35.80
MH 8.074600 5 40.373 6.540000 5 32.70
ML 14.158273 77 1090.187 5.814675 77 447.73
MS 30.142226 1702 51302.068 5.994360 1702 10202.40
MW 77.034037 7722 594856.835 5.933794 7722 45820.76
MWB 76.989829 2458 189241.000 5.907282 2458 14520.10
MWC 66.808213 5669 378735.760 5.858176 5669 33210.00
MWR 22.445385 26 583.580 5.630769 26 146.40
MWW 67.568545 1983 133988.425 6.008674 1983 11915.20

В следующем шаге мы рассмотрим, как сортировать MultiIndex.

Шаг 2: Найти уровни MultiIndex

Давайте посмотрим, что хранится в качестве MultiIndex в приведенном выше DataFrame. Поскольку у нас есть MultiIndex для столбцов, мы можем получить информацию об уровнях:

df_multi.columns
MultiIndex([( 'Depth', 'mean'), ( 'Depth', 'count'), ( 'Depth', 'sum'), ('Magnitude', 'mean'), ('Magnitude', 'count'), ('Magnitude', 'sum')], )

Чтобы получить конкретный уровень, мы можем сделать:

df_multi.columns.get_level_values(1)
Index(['mean', 'count', 'sum', 'mean', 'count', 'sum'], dtype='object')

Шаг 3: Сортировка мультииндексов в Pandas

Теперь предположим, что мы хотим отсортировать по среднему значению, которое находится под Depth. Из предыдущего шага мы видели, что нам нужно использовать: [(‘Depth’, ‘mean’)] для параметра by:

df_multi.sort_values(by=[('Depth', 'mean')], ascending=False).head(60)

Теперь значения сортируются по паре Depth — mean.

Depth Magnitude
mean count sum mean count sum
Magnitude Type
MB 81.579365 3761 306819.990 5.682957 3761 21373.60
MW 77.034037 7722 594856.835 5.933794 7722 45820.76
MWB 76.989829 2458 189241.000 5.907282 2458 14520.10
MWW 67.568545 1983 133988.425 6.008674 1983 11915.20
MWC 66.808213 5669 378735.760 5.858176 5669 33210.00

Шаг 4: Сортировка мультииндекса по нескольким уровням

Что если вы хотите отсортировать MultiIndex по нескольким уровням? В этом случае вы можете использовать следующий синтаксис:

df_multi.sort_values(by=[('Depth', 'mean'), ('Depth', 'sum')], ascending=False)
  • сначала по — (‘Depth’, ‘mean’)
  • далее по — (‘Depth’, ‘sum’)

Шаг 5: Сортировка MultiIndex по номеру уровня

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

В этом случае вы можете прочитать информацию об уровне из Шага 2 и использовать ее.

Например, сортировка MultiIndex по третьему уровню будет выглядеть так: df_multi.columns[2] — что эквивалентно (‘Depth’, ‘sum’):

df_multi.sort_values(by=[df_multi.columns[2]], ascending=False).head(5)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *