将值设置为pandas DataFrame:警告尝试在DataFrame的切片副本上设置值

时间:2018-01-28 00:40:40

标签: python pandas warnings

这是为什么? 我将在pandas中制作4个数据帧:

>>> df = pd.DataFrame({"A": ["One","Two","Three"], "B": ["Two","Three","Four"], "C": ["Three","Four","Five"], "D": ["Four","Five","Six"]})
>>> df
       A      B      C     D
0    One    Two  Three  Four
1    Two  Three   Four  Five
2  Three   Four   Five   Six
>>> df["C"][1] = "One Hundred"

一切运作良好;现在让我们先做两列,然后我们添加两列,一列用“”,另一列用NaN

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = pd.np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
>>> df["C"][1] = "hello"

Warning (from warnings module):
  File "__main__", line 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

出现警告! 好的:(这是一个问题:警告是什么?) 但是让我们继续:

现在我这样做:

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4], "C": [3,4,5], "D": [4,5,6]})
>>> df
   A  B  C  D
0  1  2  3  4
1  2  3  4  5
2  3  4  5  6
>>> df["C"][1] = 100

并且不显示警告。确定。

现在让我们再次触发警告:

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df["C"] = ""
>>> df["D"] = pd.np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
>>> df["C"][1] = "hello"
>>> 

此时没有警告!?

我正在使用IDLE 3.5.2,Python版本:3.5.2 ......

这是一个错误吗?我不知道因为我在学习。

我应该为所有列编写一个新的单独的DataFrame,然后每次都将它与df的列相等吗?

我应该制作一个python列表吗?...

有没有办法在没有警告的情况下遍历和编辑原始数据框?

为什么每次都没有弹出警告?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

您可以使用np.float64loc

iloc

答案 1 :(得分:0)

我认为正确的方法是编写一个函数并将其与apply方法一起使用。

df.apply(my_function, axis=1)

如图所示here,这样大熊猫可以超级快速地完成它。

答案 2 :(得分:-3)

正确的方法是:

df["column_name"][0] = "hello"

如果使用dot column_name方式,则表明您正在选择切片。如果你使用这种(正确的)方法,那么你就会触及细胞。可以这么说。