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.
我有一个 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.