Pandas:SettingWithCopyWarning,试图了解如何更好地编写代码,而不仅仅是是不是忽略警告

Posted

技术标签:

【中文标题】Pandas:SettingWithCopyWarning,试图了解如何更好地编写代码,而不仅仅是是不是忽略警告【英文标题】:Pandas: SettingWithCopyWarning, trying to understand how to write the code better, not just whether to ignore the warningPandas:SettingWithCopyWarning,试图了解如何更好地编写代码,而不仅仅是是否忽略警告 【发布时间】:2016-11-19 15:15:20 【问题描述】:

我正在尝试将电子表格的日期列中年份早于 1900 年的所有日期值更改为今天的日期,所以我有一个切片。

编辑:前几行代码:

df=pd.read_excel(filename)#,usecols=['NAME','DATE','EMAIL']
#regex to remove weird characters
df['DATE'] = df['DATE'].str.replace(r'[^a-zA-Z0-9\._/-]', '')
df['DATE'] = pd.to_datetime(df['DATE'])

sample row in dataframe: name, date, email
[u'Public, Jane Q.\xa0' u'01/01/2016\xa0' u'jqpublic@email.com\xa0'] 

这行代码有效。

df["DATE"][df["DATE"].dt.year < 1900] = dt.datetime.today()

然后,所有日期值都被格式化:

df["DATE"] = df["DATE"].map(lambda x: x.strftime("%m/%d/%y"))

但我得到一个错误:

SettingWithCopyWarning:  A value is trying to be set on a copy of a
slice from a DataFrame

See the caveats in the documentation:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-

对比复制

我已阅读建议使用 .loc 的文档和其他帖子

以下是推荐的解决方案:

df.loc[row_indexer,col_indexer] = value

但是df["DATE"].loc[df["DATE"].dt.year &lt; 1900] = dt.datetime.today() 给了我同样的错误,除了行号实际上是脚本中最后一行之后的行号。

我只是不明白文档试图告诉我什么,因为它与我的示例有关。

我开始搞乱拉出切片并分配给单独的数据帧,但随后我将不得不再次将它们组合在一起。

【问题讨论】:

这应该让您对正在发生的事情有一个很好的了解***.com/a/38147527/2336654 它是df.loc[df["DATE"].dt.year &lt; 1900, "DATA"] = dt.datetime.today() 但是该代码将日期值放在该行的数据框中的每一列中。这就是为什么我把它改成df["DATE"][df["DATE"]... 没有。而df.loc[df["DATE"].dt.year &lt; 1900, "DATA"] = dt.datetime.today() 并没有赶上 1700 年 【参考方案1】:

当您 df["DATE"] 并随后使用选择器 [df["DATE"].dt.year &lt; 1900] 并尝试分配给它时,您正在生成一个视图。

df["DATE"][df["DATE"].dt.year &lt; 1900]是pandas抱怨的观点。

像这样用loc 修复它:

df.loc[df.DATE.dt.year < 1900, "DATE"] = pd.datetime.today()

【讨论】:

感谢您的回答。我已经编辑了我的原始问题以包含前面的代码行和我正在使用的 excel 文件中的一行数据示例。 基于print df.is_copy,不是副本,结果是None。这是否意味着我可以取消警告? @mattrweaver 更新了我的帖子。【参考方案2】:

我的想法是你可以做到

df.loc[df.DATE.dt.year < 1900, "DATE"] = dt.datetime.today()
df.loc[:, "DATE"] = df.DATE.map(lambda x: x.strftime("%m/%d/%y")

不是在电脑上,所以我无法测试,但我认为应该这样做。

【讨论】:

第二行给了我“ValueError: year=1700 is before 1900; the datetime strftime() methods requires year >= 1900”

以上是关于Pandas:SettingWithCopyWarning,试图了解如何更好地编写代码,而不仅仅是是不是忽略警告的主要内容,如果未能解决你的问题,请参考以下文章

Pandas介绍

python pandas怎么用

如何安装pandas

idle中没有pandas

Python pandas用法

python(pandas模块)?