如何在不触发SettingWithCopyWarning [duplicate]的情况下将新列分配给DataFrame

问题描述 投票:0回答:1

这个问题在这里已有答案:

之前在类似的例子中已经提出了这个问题,但是我所看到的答案中没有一个以令人满意的方式解决这个特殊问题(见后文)。

我有一个DataFrame df和它的一个列,df['a']包含NaN值。我删除了Nan元素,然后尝试创建一个新列:

df = df[~df.isnull()]
df['b'] = False

上面给了我一个SettingWithCopyWarning

/home/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexing.py:517: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s

但是,错误消息和我在stackoverflow上看到的其他答案似乎没有一个令人满意的解决方案。最常见的建议是df.loc[:,'b'] = False,但这似乎仍然给了我警告。

我也尝试过:

df['b'] = np.zeros(len(df), dtype=bool)
df.loc[:,'b'] = np.zeros(len(df), dtype=bool)

然而所有人仍然被警告标记。那么这样做的正确方法是什么,因为显然警告暗示我做错了什么?上面的编码实践是否应该避免?我执行上述操作的一个原因特别是创建新列并锁定其dtype(例如上面,我不希望该列是浮点数)。

python pandas dataframe assign
1个回答
1
投票

你可以尝试这样的事情:

df = df.assign(b = False)

你可以在pandas.DataFrame.assign上看到更多细节

© www.soinside.com 2019 - 2024. All rights reserved.