FutureWarning:.loc或[]缺少标签,建议使用.reindex()

时间:2018-09-21 12:13:48

标签: python pandas

我的输入数据框具有四分之一格式的DateRateDate中缺少四分之一。现在,我尝试根据以下逻辑来计算Update:如果最后四分之三行可用,则选择此Rate,否则选择最后一行Rate。我当前的代码如下:

# Create dataframe
df1 = pd.DataFrame([[1, '2015Q3'], [2, '2015Q4'], 
                    [6, '2017Q1'], [7, '2017Q4'], 
                    [9, '2018Q1'], [3, '2018Q2'],
                    [5, '2018Q3'], [4, '2018Q4']],
                  columns=['Rate', 'Date'])
df1.index = pd.PeriodIndex(df1.Date, freq='Q')
df1.drop(columns='Date', inplace=True)

# This Code produces 'FutureWarning' message
df1['Update'] = np.where(np.in1d(df1.index - 3, df1.index.values),
                         df1.loc[df1.index - 3].Rate, df1.Rate.shift(1))

完整的警告消息如下:

FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike

警告中的链接:deprecate-loc-reindex-listlike

我了解到,由于我的index上有算术计算,并且计算中的某些index值不存在,这导致此警告消息并建议使用pandas.DataFrame.reindex。尽管我的意图是仅基于Rate中条件的indexTrue值来访问False,但我想numpy会为全部,因此丢失了np.where

我尝试通过扩大index.的范围来尝试,但在边界附近也会遇到相同的问题。因此,现在我的问题是如何解决此警告消息。任何见解/想法/信息/链接都将有所帮助。

1 个答案:

答案 0 :(得分:0)

问题在于,为了准备np.where可能需要或不需要的东西,df.loc[df.index - 3]被评估为df.index - 3的所有值。警告消息是一个很好的消息,建议您改用df.reindex(df.index - 3)

df1['Update'] = np.where(np.in1d(df1.index - 3, df1.index.values),
                         df1.reindex(df1.index - 3).Rate, df1.Rate.shift(1))