我正在运行一个很长的脚本,其中有一个数据框df
。随着脚本运行,构建和修改df
我在命令行中一列又一列地收到此错误:
尝试在 DataFrame 的切片副本上设置一个值。尝试
使用 .loc[row_indexer,col_indexer] = value 代替 请参阅中的注意事项
文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 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')
对于这个警告试图告诉我的 DataFrames 的本质,我是否遗漏了一些东西,一些我不理解的东西?您是否认为我可能在脚本开始时对此数据框做了一些操作,然后对象上的所有后续突变都是视图或其副本上的突变,或者正在发生类似的奇怪事情?
正如我在评论中提到的,可能的问题是在代码上游的某个地方,您分配了一些其他的切片pd.DataFrame
to df
。
这是造成混乱的常见原因,也在下面进行了解释为什么使用链式索引时赋值失败 http://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-assignment-fail-when-using-chained-indexing在链接中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:正在尝试在某个副本上设置一个值
从 DataFrame 中切片。尝试使用 .loc[row_indexer,col_indexer] =
值代替
请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)