Python视图与复制错误要求我只在脚本中使用.loc

时间:2018-05-10 17:03:03

标签: python pandas

我正在运行一个包含数据框df的长脚本。当脚本运行时,按列构建和修改df列我在命令行中反复出现此错误:

  

正在尝试在DataFrame的切片副本上设置值。尝试   使用.loc [row_indexer,col_indexer] = value请参阅中的注意事项   文件:   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的本质吗?您是否认为我可能在脚本开头对这个数据帧做了一些事情,然后对象上的所有后续突变都是视图或其副本上的突变或者某种奇怪的事情正在发生?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,可能的问题是代码中的某个上游,您为其他pd.DataFrame分配了dfWarning。 这是引起混淆的常见原因,data = pd.DataFrame({'a':range(7), 'b':list('abcccdb')}) df = data[data.a % 2 == 0] #making a subselection of the DataFrame df['b'] = 'b' 提及的链接中的why-does-assignment-fail-when-using-chained-indexing也对其进行了解释。

一个最小的例子:

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:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

请参阅文档中的警告:   http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy   """启动IPython内核的入口点。

请注意本节:

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'

写这个位的正确方法如下:

FindViewById<ImageView>(Resource.Id.imageviewName).SetImageResource(Resource.Drawable.nameofimage);