从Dataframe Cell获取单个值只能与.loc一起使用,而不能与.at

时间:2019-04-09 17:15:01

标签: python pandas dataframe

我有一个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

关于发生了什么的任何线索? 谢谢


基于 Rich Andrews '答案:

  

似乎正在发生的事情是.at在索引类型方面遇到困难。

实际上,问题在于日期时间类型。所有代码均基于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 个答案:

答案 0 :(得分:1)

医生说,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

相关问题