У чому різниця між використанням loc та використанням просто квадратних дужок для фільтрації стовпців у Pandas / Python?


83

Я помітив три методи вибору стовпця в Pandas DataFrame:

Перший спосіб вибору стовпця за допомогою loc:

df_new = df.loc[:, 'col1']

Другий метод - здається простішим і швидшим:

df_new = df['col1']

Третій спосіб - найзручніший:

df_new = df.col1

Чи є різниця між цими трьома методами? Я не думаю, що в такому випадку я б скоріше використав третій метод.

Мені в основному цікаво, чому, здається, існує три методи для того, щоб робити одне і те ж.


1
Або що df.col1? Всі три з них по суті еквівалентні для дуже простого випадку вибору стовпця. .locдозволить вам зробити набагато більше, ніж вибрати стовпець. Можливий дублікат stackoverflow.com/questions/31593201 / ...
juanpa.arrivillaga

1
Те саме роблять для простих скибочок. loc є більш явним, особливо коли ваші стовпці номери.
Габріель А

Дякую @ juanpa.arrivillaga. Хороший момент re: df.col1, що є ще одним методом вибору стовпців. Я вже кілька разів дивився на це інше питання. Це чудово для пояснення лока і iloc. Однак це питання стосується іншого методу: "df ['col1']". Я просто збентежений, чому існує два (або три) рівнозначні способи робити те, що здається одним і тим же.
Шон Маккарті

1
Великий недолік 3-го методу полягає в тому, що неоднозначно, коли назва вашого стовпця ідентична існуючому атрибуту або методу pandas. Наприклад, ви називаєте стовпець "сума". Тоді якщо ви введете df.sum, що станеться? (спойлер сповіщення, нічого корисного, хоча df.sum()все ще працює на щастя) Отже, 3-й спосіб слід розглядати як ярлик, який є нормальним, але з ним слід бути обережним
JohnE

1
Тут пристойне пояснення stackoverflow.com/questions/38886080/…
Gaurav Taneja

Відповіді:


85

У наступних ситуаціях вони поводяться однаково:

  1. Вибір одного стовпця ( df['A']те саме, що df.loc[:, 'A']-> вибирає стовпець A)
  2. Вибір списку стовпців ( df[['A', 'B', 'C']]те саме, що df.loc[:, ['A', 'B', 'C']]-> вибирає стовпці A, B і C)
  3. Нарізання за рядками ( df[1:3]те саме, що df.iloc[1:3]-> вибирає рядки 1 і 2. Зверніть увагу, однак, якщо нарізати рядки з loc, замість iloc, ви отримаєте рядки 1, 2 і 3, припускаючи, що у вас є RangeIndex . Детальніше див . Тут .)

Однак []не працює в таких ситуаціях:

  1. Ви можете вибрати один рядок за допомогою df.loc[row_label]
  2. Ви можете вибрати список рядків за допомогою df.loc[[row_label1, row_label2]]
  3. Ви можете нарізати стовпці за допомогою df.loc[:, 'A':'C']

З цими трьома не можна покінчити []. Що ще важливіше, якщо ваш вибір включає як рядки, так і стовпці, тоді призначення стає проблематичним.

df[1:3]['A'] = 5

Це вибирає рядки 1 і 2, а потім вибирає стовпець 'A' повертаючого об'єкта і присвоює йому значення 5. Проблема в тому, що об’єкт, що повертається, може бути копією, тому це не може змінити фактичний DataFrame. Це піднімає SettingWithCopyWarning . Правильним способом цього призначення є

df.loc[1:3, 'A'] = 5

Завдяки цьому .locви гарантовано зміните оригінальний DataFrame. Це також дозволяє нарізати стовпці ( df.loc[:, 'C':'F']), вибрати один рядок ( df.loc[5]) і вибрати список рядків ( df.loc[[1, 2, 5]]).

Також зауважте, що ці два не були включені в API одночасно. .locбуло додано набагато пізніше як більш потужний та явний індексатор. Дивіться відповідь Unutbu для більш детальної інформації.


Примітка: Отримання стовпців із []vs .- це зовсім інша тема. .є лише для конвенції. Це дозволяє отримати доступ лише до стовпців, чиє ім'я є дійсним ідентифікатором Python (тобто вони не можуть містити пробіли, вони не можуть складатися з чисел ...). Його не можна використовувати, коли імена суперечать методам Series / DataFrame. Його також не можна використовувати для неіснуючих стовпців (тобто призначення df.a = 1не працюватиме, якщо стовпця немає a). Крім цього, .і []ті самі.


6

locособливо корисний, коли індекс не є числовим (наприклад, DatetimeIndex), оскільки з індексу можна отримати рядки з певними мітками:

df.loc['2010-05-04 07:00:00']
df.loc['2010-1-1 0:00:00':'2010-12-31 23:59:59 ','Price']

Однак []призначений для отримання стовпців з певними іменами:

df['Price']

З []вами також може фільтрувати рядки , але більш докладно:

df[df['Date'] < datetime.datetime(2010,1,1,7,0,0)]['Price']

0

Здається, існує різниця між df.loc [] та df [], коли ви створюєте фрейм даних із кількома стовпцями.

Ви можете звернутися до цього питання: чи є хороший спосіб створити кілька стовпців за допомогою .loc?

Тут ви не можете створити кілька стовпців, використовуючи, df.loc[:,['name1','name2']]але ви можете зробити це, просто використовуючи подвійну дужку df[['name1','name2']]. (Цікаво, чому вони поводяться по-різному.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.