下面我有一个名为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
答案 0 :(得分:1)
如果使用帮助功能,您会发现尾巴来自pandas.core.generic模块:
然后您可以看到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
警告消失