Разница в скорости между обозначениями в скобках и точечными обозначениями для доступа к столбцам в пандах - PullRequest
6 голосов
/ 21 мая 2019

Давайте иметь небольшой фрейм данных: df = pd.DataFrame({'CID': [1,2,3,4,12345, 6]})

Когда я ищу членство, скорость сильно отличается в зависимости от того, прошу ли я искать в df.CID или в df['CID'].

In[25]:%timeit 12345 in df.CID
Out[25]:89.8 µs ± 254 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In[26]:%timeit 12345 in df['CID']
Out[26]:42.3 µs ± 334 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In[27]:type( df.CID)
Out[27]: pandas.core.series.Series

In[28]:type( df['CID'])
Out[28]: pandas.core.series.Series

Почему это?

1 Ответ

6 голосов
/ 21 мая 2019

df['CID'] делегирует NDFrame.__getitem__, и более очевидно, что вы выполняете операцию индексирования.

С другой стороны, df.CID делегирует NDFrame.__getattr__, что требует некоторого дополнительного подъема, главным образом для определения того, является ли CID атрибутом, функцией или столбцом, который вы используете. Вы звоните с использованием атрибута доступа (удобно, но не рекомендуется для производственного кода).


Теперь, почему это не рекомендуется? Рассмотрим,

df = pd.DataFrame({'A': [1, 2, 3]})
df.A

0    1
1    2
2    3
Name: A, dtype: int64

Нет проблем, относящихся к столбцу "A" как df.A, поскольку он не конфликтует с именами атрибутов или функций в пандах. Однако рассмотрим функцию pop (просто в качестве примера).

df.pop
# <bound method NDFrame.pop of ...>

df.pop является связанным методом df. Теперь я хотел бы создать столбец с именем «pop» по разным причинам.

df['pop'] = [4, 5, 6]
df
   A  pop
0  1    4
1  2    5
2  3    6

Отлично, но,

df.pop
# <bound method NDFrame.pop of ...>

Я не могу использовать обозначение атрибута для доступа к этому столбцу. Однако ...

df['pop']

0    4
1    5
2    6
Name: pop, dtype: int64

Обозначение в скобках все еще работает. Вот почему это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...