Почему квадратные скобки используются в dtf.loc[] в панд?

#python #pandas

Вопрос:

Мне интересно, почему это dtf.loc[x] вместо dtf.loc(x) того, чтобы . Я читал, что loc это свойство, так что это имеет смысл, потому что это не вызов функции, но теперь я не знаю, почему кто — то сделал это свойством (не очень разбираюсь в свойствах) вместо функции-для меня это было бы более интуитивно понятным.

Комментарии:

1. Важная часть здесь не в том, что это loc свойство, а в том, что это объект, который поддерживает __getitem__ . Я предполагаю, что разработчики pandas хотели, чтобы фреймы данных были похожи на массивы numpy в отношении выбора элементов.

2. Это позволяет использовать синтаксис среза (например, df.loc[:2:-1] ), что было бы невозможно с функцией (это вызвало SyntaxError бы )

Ответ №1:

<напыщенная речь>Потому что Панды-это не Питон<напыщенная речь></напыщенная речь>…

Более серьезно, Pandas-это хорошая библиотека, которая использует модуль poserful numpy (часть os scipy) для обработки больших массивов со скоростью C. Но за это приходится платить некоторыми оговорками:

  • чтобы соответствовать numpy, индексирование принимает кортеж целых чисел или срезов. И это требуется в numpy, чтобы иметь возможность векторизовать (использовать высокоскоростные процедуры C) доступы
  • loc это просто свойство фрейма данных, которое возвращает индексатор. Это должно быть определенное свойство, потому df[x] x что оно уже определено как df столбец фрейма данных

Это могла быть просто функция, которая была бы менее разрушительной для пользователей Python. Но также было важно четко указать, что это был доступ к индексации. И (причина моей первоначальной тирады), эффективность и согласованность с numpy более важны для Панд, чем согласованность с основным Python. Хорошим примером этого является равенство между двумя рядами. Для согласованности с numpy is также является серией, а не логическим значением. Но это просто нарушает ряд преимуществ Python, не позволяя использовать его для проверки того, содержит ли контейнер серии Python определенную серию in :

 a = pd.Series([1, 2, 3])
b = pd.Series([4, 5, 6])

pd.Series([1, 2, 3]) in [a, b]
 

повышения:

 Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    pd.Series([1, 2, 3]) in [a, b]
  File "...Python39site-packagespandascoregeneric.py", line 1442, in __nonzero__
    raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Что из этого следует извлечь: просто примите тот факт, что синтаксис Pandas иногда не соответствует нормальному использованию Python…