[英]Pandas DataFrame: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
[英]Pandas, set on a copy of a slice from DataFrame problem
一段时间以来,我一直在为 Pandas 警告而苦苦挣扎。
我有一段非常简单的代码:
def get_delta(df):
df['delta_current_day'] = df['close'] - df['open']
df = df[pd.notnull(df['delta_current_day'])]
df['delta_next_day'] = df['delta_current_day'].shift(-1)
return df
每次我收到此错误时:
试图在来自 DataFrame 的切片副本上设置值。 尝试使用 .loc[row_indexer,col_indexer] = value 代替
我在stackoverflow上阅读了很多关于它的问题,但没有一个对我有用。 我试过这样的事情:
df.loc[:, 'delta_next_day'] = df['delta_current_day'].shift(-1)
# OR
list = df['delta_current_day'].tolist()
df.loc[:, 'delta_next_day'] = list[:1]
但我仍然遇到同样的错误。
我究竟做错了什么?
我认为你需要DataFrame.copy
:
df = df[pd.notnull(df['delta_current_day'])].copy()
#df = df.loc[pd.notnull(df['delta_current_day'])] #or this
df['delta_next_day'] = df['delta_current_day'].shift(-1)
这是一个切片:
df = df[pd.notnull(df['delta_current_day'])]
A (
df['delta_current_day'].shift(-1)
) 值正试图在一个 (df[pd.notnull(df['delta_current_day'])]
) 来自 DataFrame 的切片副本上设置
你也可以试试这个:
# Sample data.
df = pd.DataFrame({
'open': [100, 102, np.nan, 102],
'close': [101.5, 102.5, np.nan, 104]
})
def get_delta(df):
df = df.dropna().assign(delta_current_day=df.eval('close - open'))
return df.assign(delta_next_day=df['delta_current_day'].shift(-1))
>>> get_delta(df)
open close delta_current_day delta_next_day
0 100.0 101.5 1.5 0.5
1 102.0 102.5 0.5 2.0
3 102.0 104.0 2.0 NaN
当然,这会引入前瞻偏差。 为什么今天要使用明天的增量?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.