熊猫,设置在DataFrame问题的切片副本上

时间:2020-02-05 16:57:30

标签: python 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]

但是我仍然遇到相同的错误。

我在做什么错了?

2 个答案:

答案 0 :(得分: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'])]

正在尝试在一个(df['delta_current_day'].shift(-1))值上设置 (df[pd.notnull(df['delta_current_day'])]) 来自DataFrame的切片的副本

答案 1 :(得分:1)

您也可以尝试以下方法:

# 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

当然,这会引入前瞻性偏见。为什么今天要使用明天的三角洲?