Получение одного значения из Dataframe Cell работает с .loc, но не с .at - PullRequest
1 голос
/ 09 апреля 2019

У меня есть датафрейм Pandas, который содержит некоторые даты и цены. Мой индекс содержит даты (приписанные df.set_index) и столбцы различных активов.

Это выглядит примерно так, но это [6069 строк x 306 столбцов]

            OVER_price  DI1J95_price
1995-01-02       48.61        45.662
1995-01-03       50.12        45.542
2019-03-11        6.40           NaN

У меня есть класс, который принимает в качестве параметров calcDate, который является датой индекса, diCode, который является именем актива в столбцах, и diPanel, который является моим dataFrame.

Если я бегу в своем классе df.loc:

#Find Prices     
self.diPrice = diPanel.loc[self.calcDate, self.diCode]

Я получаю ожидаемую цену, без проблем.

Если я изменю код на df.at:

#Find Prices     
self.diPrice = diPanel.at[self.calcDate, self.diCode]

Я получил исключение KeyError. Например, 2019-03-11, когда calcDate возвращает:

Исключение: KeyError 17966

Есть какие-нибудь подсказки о том, что происходит? Спасибо


На основании Рич Эндрюс 'ответ:

Похоже, что .at испытывает трудности с типом индекса.

На самом деле проблема в типе datetime. Код Allmy основан на типе numpy.datetime64[D]. Однако индекс моего DataFrame равен pandas.Timestamp.

Я смог дважды проверить, что работает:

# Print last Index value and Type
print(type(diPanel.index[6068]))
print(diPanel.index[6068])

Возвращает:

2019-03-11 00:00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

И для моего аргумента поиска:

# Print last Index value and Type
print(type(self.calcDate))
print(self.calcDate)

Возвращает:

<class 'numpy.datetime64'>
2019-03-11

По какой-то причине .loc может обойти несоответствие типов, а .at - нет. Кто-нибудь имел такую ​​же проблему и знает, почему эти два метода ведут себя по-разному? Спасибо

1 Ответ

1 голос
/ 10 апреля 2019

Док говорит, что pandas.DataFrame.at поднимает KeyError, когда метка не существует в DataFrame.

Это верно и в случае несоответствия типов.

Похоже, что .at испытывает трудности с типом индекса.

import pandas as pd
from pandas.compat import StringIO

csvdata = StringIO("""date,OVER_price,DI1J95_price
1995-01-02,48.61,45.662
1995-01-03,50.12,45.542
2019-03-11,6.40,""")

# index is a string
df = pd.read_csv(csvdata, sep=",", index_col="date")

# string being used
print(df.at['1995-01-03', 'OVER_price'])

Производит 50.12.

import pandas as pd
from pandas.compat import StringIO

csvdata = StringIO("""date,OVER_price,DI1J95_price
1995-01-02,48.61,45.662
1995-01-03,50.12,45.542
2019-03-11,6.40,""")

# index is going to be a datetime
df = pd.read_csv(csvdata, sep=",", index_col="date", parse_dates=True, infer_datetime_format=True)

# select with a datetime
from datetime import datetime as dt
print(df.at[dt(year=1995, month=1, day=3), 'OVER_price'])

Производит 50.12

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