Є два основні способи, завдяки яким панди здійснюють вибір з DataFrame.
- За міткою
- За цілим розташуванням
У документації використовується термін позиція для позначення цілого місця розташування . Мені не подобається ця термінологія, оскільки я вважаю це заплутаною. Розташування цілого числа є більш описовим і саме те, що .iloc
означає. Ключове слово тут - INTEGER - ви повинні використовувати цілі числа при виборі за цілим розташуванням.
Перш ніж показати резюме, давайте всі переконайтесь, що ...
.ix застарілий і неоднозначний, і його ніколи не слід використовувати
Для панд є три первинні індексатори . У нас є сам оператор індексації (дужки []
) .loc
, та .iloc
. Підведемо їх підсумки:
[]
- В основному вибирає підмножини стовпців, але також може вибирати рядки. Неможливо одночасно вибрати рядки та стовпці.
.loc
- вибирає підмножини рядків і стовпців лише за міткою
.iloc
- вибирає підмножини рядків і стовпців лише за цілим розташуванням
Я майже ніколи не використовую .at
або .iat
оскільки вони не додають додаткових функціональних можливостей і мають лише невелике збільшення продуктивності. Я б заперечував їх використання, якщо у вас не є дуже часова програма. Незалежно від цього, у нас є їх підсумок:
.at
вибирає одне скалярне значення у DataFrame лише за міткою
.iat
вибирає одне скалярне значення в DataFrame лише за цілим розташуванням
Окрім вибору за міткою та цілим розташуванням, існує булева вибір, також відома як булева індексація .
Приклади, що пояснюють .loc
, .iloc
булевий вибір та .at
і .iat
наведені нижче
Спершу зупинимось на відмінностях між .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'
Вибір за .at
та.iat
Вибір з .at
майже ідентичний, .loc
але він вибирає лише одну клітинку у вашій DataFrame. Ми зазвичай називаємо цю клітинку скалярною величиною. Для використання .at
передайте його як мітку рядка та стовпця, розділену комою.
df.at['Christina', 'color']
'black'
Вибір з .iat
майже ідентичний, .iloc
але він вибирає лише одне скалярне значення. Ви повинні вказати ціле число як для рядків, так і для стовпців
df.iat[2, 5]
'FL'