Pandas:SettingWithCopyWarning,试图理解如何更好地编写代码,而不仅仅是是否忽略警告
Pandas: SettingWithCopyWarning, trying to understand how to write the code better, not just whether to ignore the warning
我正在尝试将电子表格的日期列中年份早于 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 < 1900] = dt.datetime.today()
给我同样的错误,除了行号实际上是脚本中最后一行之后的行号。
我只是不明白文档试图告诉我什么,因为它与我的示例相关。
我开始胡乱拉出切片并分配给一个单独的数据帧,但随后我将不得不再次将它们组合在一起。
我的想法是你可以做到
df.loc[df.DATE.dt.year < 1900, "DATE"] = dt.datetime.today()
df.loc[:, "DATE"] = df.DATE.map(lambda x: x.strftime("%m/%d/%y")
不是在电脑上,所以我无法测试,但我认为应该可以。
当您 df["DATE"]
并随后使用选择器 [df["DATE"].dt.year < 1900]
并尝试分配给它时,您正在生成一个视图。
df["DATE"][df["DATE"].dt.year < 1900]
是pandas抱怨的观点。
像这样用 loc
修复它:
df.loc[df.DATE.dt.year < 1900, "DATE"] = pd.datetime.today()
我正在尝试将电子表格的日期列中年份早于 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 < 1900] = dt.datetime.today()
给我同样的错误,除了行号实际上是脚本中最后一行之后的行号。
我只是不明白文档试图告诉我什么,因为它与我的示例相关。
我开始胡乱拉出切片并分配给一个单独的数据帧,但随后我将不得不再次将它们组合在一起。
我的想法是你可以做到
df.loc[df.DATE.dt.year < 1900, "DATE"] = dt.datetime.today()
df.loc[:, "DATE"] = df.DATE.map(lambda x: x.strftime("%m/%d/%y")
不是在电脑上,所以我无法测试,但我认为应该可以。
当您 df["DATE"]
并随后使用选择器 [df["DATE"].dt.year < 1900]
并尝试分配给它时,您正在生成一个视图。
df["DATE"][df["DATE"].dt.year < 1900]
是pandas抱怨的观点。
像这样用 loc
修复它:
df.loc[df.DATE.dt.year < 1900, "DATE"] = pd.datetime.today()