На мой взгляд, принятый ответ сбивает с толку, поскольку он использует DataFrame только с пропущенными значениями. Мне также не нравится термин, основанный на позиции,.iloc
и вместо этого я предпочитаю целочисленное местоположение, так как оно гораздо более наглядно и именно то, что .iloc
обозначает. Ключевое слово INTEGER - .iloc
нужно INTEGERS.
Смотрите мою чрезвычайно подробную серию блогов по выбору подмножества для более
.ix устарела и неоднозначна и никогда не должна использоваться
Потому .ix
что устарела, мы сосредоточимся только на различиях между .loc
и .iloc
.
Прежде чем говорить о различиях, важно понять, что в фреймах данных есть метки, которые помогают идентифицировать каждый столбец и каждый индекс. Давайте посмотрим на пример DataFrame:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Все слова, выделенные жирным шрифтом, являются метками. Этикетки, age
, color
, food
, height
, score
и state
используются для столбцов . Другие этикетки, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
используются для индекса .
Основные способы выбора конкретных строк в DataFrame являются с .loc
и .iloc
индексаторами. Каждый из этих индексаторов также можно использовать для одновременного выбора столбцов, но сейчас проще просто сосредоточиться на строках. Кроме того, каждый из индексаторов использует набор скобок, которые следуют сразу за их именем, чтобы сделать свой выбор.
.loc выбирает данные только по меткам
Сначала поговорим об .loc
индексаторе, который выбирает данные только по меткам индекса или столбца. В нашем примере DataFrame мы предоставили значимые имена в качестве значений для индекса. Многие DataFrames не будут иметь каких-либо значимых имен и вместо этого по умолчанию будут просто целые числа от 0 до n-1, где n - длина DataFrame.
Есть три различных входа, которые вы можете использовать для .loc
- Строка
- Список строк
- Запись среза с использованием строк в качестве начального и конечного значений
Выбор одной строки с помощью .loc со строкой
Чтобы выбрать одну строку данных, поместите метку индекса внутри следующих квадратных скобок .loc
.
df.loc['Penelope']
Это возвращает строку данных в виде серии
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Выбор нескольких строк с помощью .loc со списком строк
df.loc[['Cornelia', 'Jane', 'Dean']]
Это возвращает DataFrame со строками в порядке, указанном в списке:
Выбор нескольких строк с помощью .loc с обозначением слайса
Обозначение среза определяется значениями start, stop и step. При разрезании по метке pandas включает в себя значение остановки в возвращаемом значении Следующие кусочки от Аарона до Дина включительно. Размер шага явно не определен, но по умолчанию равен 1.
df.loc['Aaron':'Dean']
Сложные фрагменты могут быть взяты так же, как списки Python.
.iloc выбирает данные только по целому расположению
Давайте теперь обратимся к .iloc
. Каждая строка и столбец данных в DataFrame имеет целочисленное местоположение, которое определяет его. Это в дополнение к метке, которая визуально отображается в выходных данных . Целочисленное местоположение - это просто число строк / столбцов сверху / слева, начиная с 0.
Есть три различных входа, которые вы можете использовать для .iloc
- Целое число
- Список целых чисел
- Срезовая запись с использованием целых чисел в качестве начального и конечного значений
Выбор одной строки с .iloc с целым числом
df.iloc[4]
Это возвращает 5-ую строку (целочисленное расположение 4) как серию
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Выбор нескольких строк с .iloc со списком целых чисел
df.iloc[[2, -2]]
Это возвращает DataFrame третьей и второй до последней строки:
Выбор нескольких строк с помощью .iloc с обозначением среза
df.iloc[:5:3]
Одновременный выбор строк и столбцов с .loc и .iloc
Одной из отличных способностей обоих .loc/.iloc
является их способность выбирать строки и столбцы одновременно. В приведенных выше примерах все столбцы возвращались из каждого выбора. Мы можем выбрать столбцы с теми же типами входов, что и для строк. Нам просто нужно разделить выбор строки и столбца запятой .
Например, мы можем выбрать строки Джейн и Дина только с высотой, счетом и состоянием столбцов следующим образом:
df.loc[['Jane', 'Dean'], 'height':]
При этом используется список меток для строк и нотации для столбцов
Естественно, мы можем делать подобные операции, .iloc
используя только целые числа.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Одновременный выбор с метками и целочисленным расположением
.ix
был использован для выбора одновременно с метками и целочисленным местоположением, что было полезно, но иногда сбивало с толку и неоднозначно, и, к счастью, это устарело. В случае, если вам нужно сделать выборку с сочетанием меток и целочисленных местоположений, вы должны будете сделать как метки выбора, так и целочисленные местоположения.
Например, если мы хотим выбрать строки Nick
и Cornelia
вместе со столбцами 2 и 4, мы можем использовать .loc
преобразование целых чисел в метки со следующим:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Или, в качестве альтернативы, преобразуйте метки индекса в целые числа с помощью get_loc
метода index.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Логическое выделение
Индексатор .loc также может выполнять логический выбор. Например, если мы заинтересованы в поиске всех строк порога возраст выше 30 и возвращать только food
и score
столбцы , мы можем сделать следующее:
df.loc[df['age'] > 30, ['food', 'score']]
Вы можете повторить это с, .iloc
но вы не можете передать это логический ряд. Вы должны преобразовать логическую серию в массив numpy следующим образом:
df.iloc[(df['age'] > 30).values, [2, 4]]
Выбор всех строк
Можно использовать .loc/.iloc
только для выбора столбца. Вы можете выбрать все строки, используя двоеточие, как это:
df.loc[:, 'color':'score':2]
Оператор индексирования также []
может выбирать строки и столбцы, но не одновременно.
Большинству людей знакомо основное назначение оператора индексации DataFrame - выбор столбцов. Строка выбирает один столбец в качестве Серии, а список строк выбирает несколько столбцов в качестве DataFrame.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Использование списка выбирает несколько столбцов
df[['food', 'score']]
Люди менее знакомы с тем, что при использовании обозначения среза выбор происходит по меткам строк или по целочисленным местоположениям. Это очень сбивает с толку и то, что я почти никогда не использую, но это работает.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
Явность .loc/.iloc
выбора строк очень предпочтительна. Один оператор индексирования не может выбирать строки и столбцы одновременно.
df[3:5, 'color']
TypeError: unhashable type: 'slice'