我正在运行一个长脚本,该脚本具有数据帧df
。 随着脚本的运行,逐列构建和修改df
我在命令行中一遍又一遍地收到此错误:
正在尝试在数据帧中的切片副本上设置值。尝试 使用 .loc[row_indexer,col_indexer] = 值代替 请参阅中的注意事项 文档: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
但是随后它会打印出导致警告的行,看起来不会有问题。如下行将触发它(每行单独触发它(:
df['ZIP_DENS'] = df['ZIP_DENS'].astype(str)
df['AVG_WAGE'] = df['AVG_WAGE'].astype(str).apply(lambda x:x if x != 'nan' else 'unknown')
df['TERM_BIN'] = df['TERMS'].map(terms_dict)
df['LOSS_ONE'] = 'T_'+ df['TERM'].astype(str) +'_C_'+ df['COMP'].astype(str) + df['SIZE']
# this one's inside a loop:
df[i + '_BIN'] = df[i + '_BIN'].apply(lambda x:x if x != 'nan' else 'unknown')
有一些我在数据帧上所做的突变的例子。现在,此警告刚刚开始出现,但我无法在解释器中重现此问题。当我打开终端时,我会尝试这样的事情,但它没有给我任何警告:
import pandas as pd
df = pd.DataFrame([list('ab'),list('ef')],columns=['first','second'])
df['third'] = df[['first','second']].astype('str')
我是否缺少一些东西,一些我不了解此警告试图告诉我的数据帧性质的东西?您是否认为我在脚本开始时对这个数据帧做了什么,然后对象上的所有后续突变都是视图或视图副本上的突变,或者正在发生类似奇怪的事情?
正如我在评论中提到的,可能的问题是,在代码的上游某个地方,您分配了一部分其他pd.DataFrame
来df
。 这是造成混淆的常见原因,在Warning
提到的链接中,为什么分配分配失败时使用链式索引下也有解释。
一个最小的例子:
data = pd.DataFrame({'a':range(7), 'b':list('abcccdb')})
df = data[data.a % 2 == 0] #making a subselection of the DataFrame
df['b'] = 'b'
/home/user/miniconda3/envs/myenv/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning:正在尝试在 从数据帧切片。尝试使用 .loc[row_indexer,col_indexer] = 取值
请参阅文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy ""启动IPython内核的入口点。
请注意,本节:
df = data[data.a % 2 == 0] #making a subselection of the DataFrame
df['b'] = 'b'
也可以这样重写:
data[data.a % 2 == 0]['b'] = 'b' #obvious chained indexing
df = data[data.a % 2 == 0]
编写此位的正确方法是:
data = pd.DataFrame({'a':range(7), 'b':list('abcccdb')})
df = data.loc[data.a % 2 == 0].copy() #making a copy of the subselection
df.loc[:,'b'] = 'b'