df.at и df.loc для получения скалярного значения дают разные результаты - PullRequest
0 голосов
/ 04 мая 2018

Я следую учебнику "10 минут до панд" на http://pandas.pydata.org/pandas-docs/stable/10min.html

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

df.loc['20130101','A']

выходы -0.25092116222457655 в моем случае

пока

df.at['20130101','A']

приводит к TypeError и KeyError одновременно.

pd.__version__

'0.20.3'

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

pd.DataFrame.at требует, чтобы вы указали метку в правильном типе объекта.

pd.DataFrame.loc включает дополнительную логику для преобразования строки в datetime.

Например, это будет работать:

df.at[pd.to_datetime('20130101'),'A']

Обратите внимание, что это одна из причин, почему .at & .iat работает лучше, чем .loc & .iloc для доступа к скалярам: входы имеют большие ограничения.

0 голосов
/ 04 мая 2018

.at не поддерживает приведение даты и времени, как строки к дате / времени, как .loc, вам нужно сделать:

In[76]:
df.at[pd.Timestamp('20130101'),'A']

Out[76]: 0.18495502425349103

KeyError вызывается, потому что он пытается соответствовать строке '20130101', которой нет в вашем индексе, ваш тип индекса - DatetimeIndex, а dtypes элемента - Timestamps

Кроме того, в учебном пособии показана передача dates[0], которая не совпадает с передачей даты и времени, как строка

К сожалению, документы не детализируют семантические различия между двумя методами

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