Сортировка и ранжирование
Сортировка набора данных по некоторому критерию – еще одна важная встроенная операция. Для лексикографической сортировки по индексу служит метод sort_index, который возвращает новый отсортированный объект:
In [201]: obj = Series(range(4), index=['d', 'a', 'b', 'c'])
In [202]: obj.sort_index()
Out[202]:
a 1
b 2
c 3
d 0
dtype: int64
В случае DataFrame можно сортировать по индексу, ассоциированному с любой осью:
In [203]: frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
.....: index=['three', 'one'],
.....: columns=['d', 'a', 'b', 'c'])
In [204]: frame.sort_index()
Out[204]:
d a b c
one 4 5 6 7
three 0 1 2 3
In [205]: frame.sort_index(axis=1)
Out[205]:
a b c d
three 1 2 3 0
one 5 6 7 4
По умолчанию данные сортируются в порядке возрастания, но можно отсортировать их и в порядке убывания:
In [206]: frame.sort_index(axis=1, ascending=False)
Out[206]:
d c b a
three 0 3 2 1
one 4 7 6 5
Для сортировки Series по значениям служит метод sort_values:
In [207]: obj = pd.Series([4, 7, –3, 2])
In [208]: obj.sort_values()
Out[208]:
2 –3
3 2
0 4
1 7
dtype: int64
Отсутствующие значения по умолчанию оказываются в конце Series:
In [209]: obj = Series([4, np.nan, 7, np.nan, –3, 2])
In [210]: obj.sort_values()
Out[210]:
4 –3.0
5 2.0
0 4.0
2 7.0
1 NaN
3 NaN
dtype: float64
Объект DataFrame можно сортировать по значениям в одном или нескольких столбцах. Для этого имена столбцов следует передать в качестве значения параметра by метода sort_values:
In [211]: frame = pd.DataFrame({'b': [4, 7, –3, 2], 'a': [0, 1, 0, 1]})
In [212]: frame
Out[212]:
a b
0 0 4
1 1 7
2 0 –3
3 1 2
In [213]: frame.sort_values(by='b')
Out[213]:
a b
2 0 –3
3 1 2
0 0 4
1 1 7
Для сортировки по нескольким столбцам следует передать список имен:
In [214]: frame.sort_index(by=['a', 'b'])
Out[214]:
a b
2 0 –3
0 0 4
3 1 2
1 1 7
Ранжирование заключается в присваивании рангов – от единицы до числа присутствующих в массиве элементов. Для ранжирования применяется метод rank объектов Series и DataFrame; по умолчанию rank обрабатывает связанные ранги, присваивая каждой группе средний ранг:
In [215]: obj = Series([7, –5, 7, 4, 2, 0, 4])
In [216]: obj.rank()
Out[216]:
0 6.5
1 1.0
2 6.5
3 4.5
4 3.0
5 2.0
6 4.5
dtype: float64
Ранги можно также присваивать в соответствии с порядком появления в данных:
In [217]: obj.rank(method='first')
Out[217]:
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
Здесь элементам 0 и 2 присвоен не средний ранг 6.5, а ранг 6 и 7, потому что в данных метка 0 предшествует метке 2. Можно ранжировать и в порядке убывания:
# В случае связанных рангов выбрать максимальный ранг в группе
In [218]: obj.rank(ascending=False, method='max')
Out[218]:
0 2.0
1 7.0
2 2.0
3 4.0
4 5.0
5 6.0
6 4.0
dtype: float64
В табл. 5.6 перечислены способы обработки связанных рангов.
Достарыңызбен бөлісу: |