【问题标题】:Warning: A value is trying to be set on a copy of a slice from a DataFrame警告:试图在 DataFrame 中的切片副本上设置值
【发布时间】:2016-06-16 03:15:46
【问题描述】:

我有这个数据框:

               Pred
Date               
2002-03-01 -0.03729
2002-04-01  0.11047
2002-05-01  0.02842
2002-06-01  0.01005
2002-07-01 -0.03607
2002-08-01  0.07484
...

我正在使用以下功能:

def lag(df):
    df.columns=['Value']
    df.sort_index(ascending=True)

    df['1lag']=df.Value.shift(1)
    df['2lag']=df.Value.shift(2)
    df['3lag']=df.Value.shift(3)
    df['4lag']=df.Value.shift(4)

它一直给我同样的警告:

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
df['1lag']=df.Value.shift(1)
/Users/file.py:1020: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

每个 df.Value.shift 命令都会发出一个警告。 任何想法为什么会发生?

【问题讨论】:

标签: pandas


【解决方案1】:

试试这个:

def lag(df):
    df.columns=['Value']
    df.sort_index(ascending=True)

    df = df.assign(lag1=df.Value.shift(1))
    df = df.assign(lag2=df.Value.shift(2))
    df = df.assign(lag3=df.Value.shift(3))
    df = df.assign(lag4=df.Value.shift(4))
    return df

【讨论】:

  • 如果需要列名中包含空格怎么办?
  • @CS 如df['Some Value'].shift(1)?还是df.assign(some_lag=df.Value.shift(1)?后一种情况需要用下划线等字符替换空格。
猜你喜欢
  • 2016-12-22
  • 2021-03-05
  • 2019-03-30
  • 2016-09-23
  • 2016-02-17
  • 2016-08-24
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多