如何在不触发 SettingWithCopyWarning 的情况下将新列分配给 DataFrame
How to assign a new column to a DataFrame without triggering the SettingWithCopyWarning
这个问题之前在类似的例子中被问过,但是我看到的答案都没有以令人满意的方式解决这个特定问题(见下文)。
我有一个 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
但是,错误信息和我在Whosebug上看到的其他答案似乎都没有令人满意的解决方案。最常见的建议是 df.loc[:,'b'] = False
但这似乎仍然给我警告。
我也试过:
df['b'] = np.zeros(len(df), dtype=bool)
df.loc[:,'b'] = np.zeros(len(df), dtype=bool)
然而,所有这些仍然被标记为警告。那么正确的方法是什么,因为警告显然暗示我做错了什么?上面的编码实践有什么应该避免的吗?我执行上述操作的一个原因特别是要创建新列并锁定它们的 dtype
(例如上面的例子,我不希望该列是浮点数)。
您可以尝试这样的操作:
df = df.assign(b = False)
上查看更多详细信息
这个问题之前在类似的例子中被问过,但是我看到的答案都没有以令人满意的方式解决这个特定问题(见下文)。
我有一个 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
但是,错误信息和我在Whosebug上看到的其他答案似乎都没有令人满意的解决方案。最常见的建议是 df.loc[:,'b'] = False
但这似乎仍然给我警告。
我也试过:
df['b'] = np.zeros(len(df), dtype=bool)
df.loc[:,'b'] = np.zeros(len(df), dtype=bool)
然而,所有这些仍然被标记为警告。那么正确的方法是什么,因为警告显然暗示我做错了什么?上面的编码实践有什么应该避免的吗?我执行上述操作的一个原因特别是要创建新列并锁定它们的 dtype
(例如上面的例子,我不希望该列是浮点数)。
您可以尝试这样的操作:
df = df.assign(b = False)
上查看更多详细信息