熊猫:通过.loc更改数据框单元格值会引发SettingWithCopyWarning

时间:2019-02-06 17:08:07

标签: python pandas dataframe

下面我有一个名为sign = 1 result = 0 for i in range(100000): result += 1 / (2*i + 1) * sign sign *= -1 print("pi (estimate): ", result*4) 的DataFrame,从中我导出了另一个DataFrame,它是mydf的尾端。我正在尝试找出下面的mydf DataFrame是否实际上包含基础tail5 DataFrame的副本 view 。但是,当我使用mydf方法更新单元格的值时,它将引发.iloc。知道为什么吗?熊猫manual page on tail没有说出SettingWithCopyWarning方法返回的数据的性质(是否返回了 view [可以修改原始视图的结果来修改)数据源]或副本 [出于某些原因不应修改])。这是代码:

tail

在上述情况下,底层>>> mydf = pandas.DataFrame(numpy.random.rand(10,3), columns=('a','b','c')) >>> mydf a b c 0 0.263551 0.175394 0.570277 1 0.032766 0.243175 0.524796 2 0.034853 0.607542 0.568370 3 0.021440 0.685070 0.121700 4 0.253535 0.402529 0.264492 5 0.381109 0.964744 0.362228 6 0.860779 0.670297 0.035365 7 0.872243 0.960212 0.306681 8 0.698318 0.530086 0.469734 9 0.910518 0.697919 0.238539 >>> tail5 = mydf.tail(5) >>> tail5 a b c 5 0.381109 0.964744 0.362228 6 0.860779 0.670297 0.035365 7 0.872243 0.960212 0.306681 8 0.698318 0.530086 0.469734 9 0.910518 0.697919 0.238539 >>> tail5.loc[9,'a']= 0.8321 /.../lib/python3.7/site-packages/pandas/core/indexing.py:189: 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-versus-copy self._setitem_with_indexer(indexer, value) /.../bin/ipython:1: 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-versus-copy 中的数据被修改为mydf分配的副作用:

.iloc

1 个答案:

答案 0 :(得分:1)

如果使用帮助功能,您会发现尾巴来自pandas.core.generic模块:

help(pandas.DataFrame.tail)

然后您可以看到tail方法使用iloc返回最后5行,这意味着它返回了数据帧的子集。这就是您收到警告消息的原因

pandas.core.generic 通过这样做:

    mydf = pandas.DataFrame(np.random.rand(10,3), columns=('a','b','c'))
    tail5 = mydf.tail(5).copy()
    tail5.loc[9,'a']= 0.8321

警告消失