使用.loc的SettingWithCopyWarning

时间:2019-12-03 11:03:12

标签: python pandas chaining

我有一个数据框,其中包含有关不同日期和日期的不同植物的数据。 enter image description here

我创建了一个新的数据框,其中仅包含我要使用的植物:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

df_plants = pd.read_csv('Data_plants_26_11_2019.csv')
df_Nit=pd.read_csv('chemometrics.csv')

#create new colum which contains aonly the hour using lambda
df_plants['Hour']=df_plants['time'].apply(lambda time: time.split(' ')[1])
df_plants['date']=df_plants['time'].apply(lambda time: time.split(' ')[0])

#select only my plants
options=['J01B','J01C','J02C','J02D','J03B','J03C','J04C','J08C','J08D','J09A','J09C','J10A','J12C','J12D','J13A','J14A','J15A','J18A']
filter_plants=df_plants[df_plants['plant'].isin(options)]

创建此索引后,我尝试计算一些索引(使用图中未显示的列),但是我开始收到警告,当我在所有植物上计算索引时都没有得到:

filter_plants['NDVI']=(filter_plants['801.03']- filter_plants['680.75'])/(filter_plants['801.03']+filter_plants['680.75'])
  

C:\ ProgramData \ Anaconda2 \ lib \ 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   “”“启动IPython内核的入口点。

我在https://www.dataquest.io/blog/settingwithcopywarning/处已了解到此警告,我认为这与我尚未使用loc创建“过滤器工厂”这一事实有关,因此我尝试在之前添加它:

#select only plants that their nitrogen content was checked
options=['J01B','J01C','J02C','J02D','J03B','J03C','J04C','J08C','J08D','J09A','J09C','J10A','J12C','J12D','J13A','J14A','J15A','J18A']
filter_plants=df_plants.loc[df_plants['plant'].isin(options)]

但是它没有帮助并且是相同的。 我还尝试在索引的计算中添加 loc ,但是我仍然遇到相同的错误。

出什么问题了?我该如何解决它,这样我在进行此操作的后续步骤中不会出现错误?

我的最终目标是摆脱警告。

1 个答案:

答案 0 :(得分:1)

我通常的处理此警告的方法是df.copy()。基本上,这里的问题在于,除非您使用filter_plants,否则熊猫无法正确地将df_plants做成自己的数据帧(如果我理解正确的话),而只是.copy()的一部分。

如果您只是将行更改为:

filter_plants=df_plants[df_plants['plant'].isin(options)].copy()

那应该解决它。