На мою думку, прийнята відповідь є заплутаною, оскільки вона використовує DataFrame з лише відсутніми значеннями. Я також не подобається термін позиція на основі для .iloc
і замість цього, вважають за краще ціле місце , як це набагато більш змістовний і саме те , що .iloc
варто. Ключове слово INTEGER - .iloc
потребує INTEGERS.
Докладніше дивіться мою надзвичайно детальну серію блогу про вибір підмножини
.ix застарілий і неоднозначний, і його ніколи не слід використовувати
Оскільки .ix
застаріле, ми зупинимося лише на відмінностях між .loc
та .iloc
.
Перш ніж говорити про відмінності, важливо розуміти, що DataFrames мають мітки, які допомагають ідентифікувати кожен стовпець та кожен індекс. Давайте подивимось на зразок 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 із позначенням фрагмента
Позначення зрізів визначаються значеннями початку, зупинки та кроку. Під час нарізки за міткою панди включають значення зупинки у зворотному порядку. Наступні фрагменти від Аарона до Діна, включно. Її розмір кроку не визначено прямо, але за замовчуванням до 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
є їх здатність одночасно обирати і рядки, і стовпці. У наведених вище прикладах усі стовпці поверталися з кожного вибору. Ми можемо вибрати стовпці з тими ж типами входів, що і для рядків. Нам просто потрібно відокремити виділення рядків і стовпців комою .
Наприклад, ми можемо вибрати рядки Jane та Dean з висотою стовпців, оцінкою та станом так:
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
методом індексу.
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'