我将值列表分配给新列,并收到警告SettingWithCopyWarning:

时间:2019-05-18 21:02:33

标签: python pandas

我有一个数据框,其中包含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/ 主要。py:14:SettingWithCopyWarning: 试图在DataFrame的切片副本上设置一个值。 尝试改用.loc [row_indexer,col_indexer] =值

请参阅文档中的警告: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

1 个答案:

答案 0 :(得分:0)

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

dfabovemax['YtoDt'] = list(ytodt2)

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