如何解决为什么我从熊猫那里得到SettingWithCopyWarning
关于此警告,我遇到了一些问题,但仍然有些困惑。我的方法如下:
def _apply_standard_filters(self,df: pd.DataFrame) -> pd.DataFrame:
logger.info("Applying standard filters")
df["Type"] = df["Type"].apply(lambda x: x.strip().lower())
df = df[df.Type == "xxxx"]
df = df[df['Other Column'].str.contains(r"some_regex",na=False,regex=True)]
return df
关于lambda函数的那一行我收到警告。最初,当行看起来像这样时,我得到了警告:
df["Type"] = df["Type"].str.strip()
df["Type"] = df["Type"].str.lower()
我以为这可能是分配两次相同的列,所以我改写为使用apply(如第一个代码段)。仍然收到相同的警告。最后,我再次用loc重写了,就像这样:
df["Type"] = df.loc[:,"Type"].apply(lambda x: x.strip().lower())
,警告仍然存在。我在这里想念什么?
这也是我得到的输出
2020-08-12 15:38:14,498 - filters - INFO - Applying standard filters
filters.py:16: 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: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df["Type"] = df.loc[:,"Type"].apply(lambda x: x.strip().lower())
在调用该方法之前,可能与我要做的事情有关吗?在我根据用户的选择使用其他过滤方法之后,始终使用_apply_standard_filters()。但是,我永远不会在标准过滤器之前触摸“类型”或“其他列”。通常看起来像这样:
df = df[df.Column1.str.contains(r"some other regex pattern",regex=True)]
df = self._apply_standard_filters(df=df)
任何建议都值得赞赏。
干杯!
编辑
在@ r.ook回答之后,我应用了他的解决方案,对其进行了一些修复,并且在我面前仍然有相同的警告。现在代码如下:
def _apply_standard_filters(self,df: pd.DataFrame) -> pd.DataFrame:
logger.info("Applying standard filters")
df["Type"] = df.loc[:,"Type"].apply(lambda x: x.strip().lower())
df = df.loc[df.Type == "xxxx"]
df = df.loc[df['Other Column'].str.contains(r"some_regex",regex=True)]
df = df[df['Other Column'].str.contains(r"some_regex",regex=True)]
return df
def filter_something(self,df: pd.DataFrame) -> pd.DataFrame:
df = df.loc[df.Column1.str.contains(r"^Some regex",regex=True)]
df = self._apply_standard_filters(df=df)
return df
当我运行它时,我仍然得到:
filters.py:17: 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/user_guide/indexing.html#returning-a-view-versus-a-copy
df["Type"] = df.loc[:,"Type"].apply(lambda x: x.strip().lower())
我应该专注于警告中提到的这一行吗?我以前没看过这个警告。当我将strip()
和lower()
添加到df["Type"]
时,它出现了。当我运行不带该行的代码时,无论我在其他df分配中所做的更改如何,都不会发出警告。
解决方法
只要您有df = df[...]
这样的行,就会触发SettingWithCopyWarning
。
从最后一个问题看来,您似乎已经在将副本传递到方法中,这就是触发警告的原因。
改为执行此操作:
df = df.loc[:,df.Column1.str.contains(r"some other regex pattern",na=False,regex=True)]
df = self._apply_standard_filters(df=df)
同样,按照相同的df = df[...]
模式编辑方法中的所有行:
df = df.loc[:,df.Type == "xxxx"]
df = df.loc[:,df['Other Column'].str.contains(r"some_regex",regex=True)]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。