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)