SettingWithCopyWarning 使用 .loc
SettingWithCopyWarning using .loc
我有一个数据框,其中包含不同日期和日期的不同植物的数据。
我创建了新的数据框,其中只包含我想要使用的植物:
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: A value is trying to be set on a copy of a
slice from a DataFrame. Try using .loc[row_indexer,col_indexer] =
value instead
See the caveats in the documentation:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
"""Entry point for launching an IPython kernel.
我在这里读到了这个警告 https://www.dataquest.io/blog/settingwithcopywarning/ 我认为这与我没有使用 loc 创建 "filter plants" 的事实有关,所以我之前尝试添加它:
#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 但我仍然遇到同样的错误。
问题是什么?我该如何修复它,这样我在接下来的步骤中就不会出错 运行?
我的最终目标当然是消除警告。
我通常处理这个警告的方式是df.copy()
。基本上这里的问题是 pandas 没有正确地使 filter_plants
成为它自己的数据帧(如果我理解正确的话),而只是 df_plants
的一部分,除非你使用 .copy()
。
如果您只需将行更改为:
filter_plants=df_plants[df_plants['plant'].isin(options)].copy()
这应该可以解决问题。
我有一个数据框,其中包含不同日期和日期的不同植物的数据。
我创建了新的数据框,其中只包含我想要使用的植物:
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: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
我在这里读到了这个警告 https://www.dataquest.io/blog/settingwithcopywarning/ 我认为这与我没有使用 loc 创建 "filter plants" 的事实有关,所以我之前尝试添加它:
#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 但我仍然遇到同样的错误。
问题是什么?我该如何修复它,这样我在接下来的步骤中就不会出错 运行?
我的最终目标当然是消除警告。
我通常处理这个警告的方式是df.copy()
。基本上这里的问题是 pandas 没有正确地使 filter_plants
成为它自己的数据帧(如果我理解正确的话),而只是 df_plants
的一部分,除非你使用 .copy()
。
如果您只需将行更改为:
filter_plants=df_plants[df_plants['plant'].isin(options)].copy()
这应该可以解决问题。