Выборка с помощью loc и iloc
Для доступа к строкам DataFrame по индексу с помощью меток я ввел специальные индексные операторы loc и iloc. Они позволяют выбрать подмножество строк и столбцов DataFrame с применением нотации NumPy, используя либо метки строк (loc), либо целые числа (iloc). столбцов по меткам:
In [137]: data.loc['Colorado', ['two', 'three']]
Out[137]:
two 5
three 6
Name: Colorado, dtype: int64
Затем произведем аналогичную выборку, но уже по целочисленным индексам:
In [138]: data.iloc[2, [3, 0, 1]]
Out[138]:
four 11
one 8
two 9
Name: Utah, dtype: int64
In [139]: data.iloc[2]
Out[139]:
one 8
two 9
three 10
four 11
Name: Utah, dtype: int64
In [140]: data.iloc[[1, 2], [3, 0, 1]]
Out[140]:
four one two
Colorado 7 0 5
Utah 11 8 9
Обе функции индексирования работают не только с одиночными метками или списками меток, но и со срезами:
In [141]: data.loc[:'Utah', 'two']
Out[141]:
Ohio 0
Colorado 5
Utah 9
Name: two, dtype: int64
In [142]: data.iloc[:, :3][data.three > 5]
Out[142]:
one two three
Colorado 0 5 6
Utah 8 9 10
New York 12 13 14
Таким образом, существует много способов выборки и реорганизации данных, содержащихся в объекте pandas. Для DataFrame краткая сводка многих из них приведена в табл. 5.4. Позже мы увидим, что при работе с иерархическими индексами есть ряд дополнительных возможностей.
Целочисленные индексы
Новички часто испытывают затруднения при работе с объектами pandas, индексированными целыми числами, из-за различий с семантикой индексирования встроенных в Python структур данных, таких как списки и кортежи. Например, вряд ли вы ожидаете столкнуться с ошибкой в следующем коде:
ser = pd.Series(np.arange(3.))
ser
ser[–1]
В данном примере pandas могла бы откатиться к целочисленному индексированию, но в общем случае попытка сделать это приводит к тонким ошибкам. Здесь мы имеем индекс, содержащий 0, 1, 2, но понять, чего хочет пользователь (индексировать по метке или по позиции), трудно:
In [144]: ser
Out[144]:
0 0.0
1 1.0
2 2.0
dtype: float64
С другой стороны, если индекс не является целым числом, то никакой неоднозначности не возникает:
In [145]: ser2 = pd.Series(np.arange(3.), index=['a', 'b', 'c'])
In [146]: ser2[–1]
Out[146]: 2.0
Чтобы не оставлять место двусмысленности, в случае когда индекс по некоторой оси содержит целые числа, выборка данных всегда производится по метке. А чтобы точно выразить свои намерения, используйте метод loc (для доступа по метке) или iloc (для доступа по позиции):
In [147]: ser[:1]
Out[147]:
0 0.0
dtype: float64
In [148]: ser.loc[:1]
Out[148]:
0 0.0
1 1.0
dtype: float64
In [149]: ser.iloc[:1]
Out[149]:
0 0.0
dtype: float64
Достарыңызбен бөлісу: |