Python 视图与复制错误希望我仅在脚本中使用 .loc



我正在运行一个长脚本,该脚本具有数据帧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.DataFramedf。 这是造成混淆的常见原因,在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'

最新更新