首页 > 解决方案 > 我将值列表分配给新列并收到警告 SettingWithCopyWarning:

问题描述

我有一个数据框,其中包含 2015 年的月份和日期。我将年初至今的值计算到一个列表中。我将此列表分配给数据框中的一个新列,但收到一条警告 SettingWithCopyWarning。我该如何解决它以及为什么会发生这种情况的一些解释。提前谢谢大家。

print(dfabovemax.head())
print(dfabovemax.tail())
      MaxTemp  Data_Value
Mon-Date                     
01-02         114         113
01-10         142         126
04-10         213         203
04-15         246         228
05-03         203         195
      MaxTemp  Data_Value
Mon-Date                     
01-02         114         113
01-10         142         126
04-10         213         203
04-15         246         228
05-03         203         195

fmt = '%Y-%m-%d'
ytodt2 = []

for i in dfabovemax.index:
    s='2005-{}'.format(i)
    dt = datetime.datetime.strptime(s, fmt)
    tt = dt.timetuple()
    ytodt2.append(tt.tm_yday)

dfabovemax['YtoDt'] = list(ytodt2)

我收到警告

/opt/conda/lib/python3.6/site-packages/ipykernel/ main .py:14:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置值。尝试改用 .loc[row_indexer,col_indexer] = value

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

print(dfabovemax.head())
print(dfabovemax.tail())

     MaxTemp  Data_Value  YtoDt
Mon-Date                            
01-02         114         113      2
01-10         142         126     10
04-10         213         203    100
04-15         246         228    105
05-03         203         195    123
      MaxTemp  Data_Value  YtoDt
Mon-Date                            
12-25         140         135    359
12-26         152         130    360
12-27         138         118    361
12-28         134         124    362

12-30 134 128 364

标签: pythonpandas

解决方案


尝试在数据框的副本上设置值时,您经常会收到此警告。您的代码中唯一可能发生这种情况的地方是

dfabovemax['YtoDt'] = list(ytodt2)

这意味着,dfabovemax 很可能是另一个数据帧的结果。在 python 中, dfabovemax 仍然引用它的原始数据帧。为了纠正这种情况,请在制作 dfabovemax 时使用copy() 。


推荐阅读