Pandas SettingWithCopyWarning np.where

Pandas SettingWithCopyWarning with np.where

我有一个 pandas 数据框,其中有一列包含一堆相关性(所有浮点值)。我正在尝试创建另一列以将这些相关性分为三个不同的类别 (high/medium/low)。我这样做使用 np.where:

df['Category'] = np.where(df['Correlation'] >= 0.5, 'high', 
                                   np.where(data['Correlation'] >= 0.3, 'medium','low'))

当我尝试这样做时,我总是会收到 SettingWithCopyWarning(虽然它似乎有效)。我已经阅读了副本和视图之间的区别,甚至看到了使用 .where 而不是其他方法的建议,以避免任何混淆(和 SettingWithCopyWarning)。我仍然无法完全理解为什么使用这种方法会收到警告,有人可以解释一下吗?

很可能您的 df 已创建为另一个 DataFrame 的 view, 例如:

data = pd.DataFrame({'Correlation': np.arange(0, 1.3, 0.1)})  # Your "initial" DataFrame
df = data.iloc[0:11]

现在 df 保存了 data 的一些片段,但它使用了数据缓冲区 数据.

那么如果您尝试 运行:

df['Category'] = np.where(df['Correlation'] >= 0.5, 'high',
    np.where(df['Correlation'] >= 0.3, 'medium', 'low'))

只是出现了提到的警告。

要摆脱它,创建 df 作为 independent DataFrame,例如:

df = data.iloc[0:11].copy()

现在 df 使用其 自己的 数据缓冲区,您可以随意使用它 您愿意,包括添加新列。

要检查您的 df 是否使用了自己的数据缓冲区,运行:

df._is_view

在你原来的环境中(没有我的修正)你应该得到 False,但在使用 .copy() 创建 df 后,您应该得到 True.