我的输入数据框具有四分之一格式的Date
和Rate
。 Date
中缺少四分之一。现在,我尝试根据以下逻辑来计算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
中条件的index
或True
值来访问False
,但我想numpy会为全部,因此丢失了np.where
我尝试通过扩大index.
的范围来尝试,但在边界附近也会遇到相同的问题。因此,现在我的问题是如何解决此警告消息。任何见解/想法/信息/链接都将有所帮助。
答案 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))