熊猫 SettingWithCopyWarning 的操作

Posted

技术标签:

【中文标题】熊猫 SettingWithCopyWarning 的操作【英文标题】:Action with pandas SettingWithCopyWarning 【发布时间】:2016-11-03 23:04:06 【问题描述】:

我尝试delete 某个列并用

转换列中的某些值
df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True)
df2['date'] = df2['date'].map(lambda x: str(x)[1:])
df2['date'] = df2['date'].str.replace(':', ' ', 1)
df2['date'] = pd.to_datetime(df2['date'])

我得到所有这些字符串

  df2.drop(df2.columns[[0, 1, 3]], axis=1, inplace=True)
C:/Users/����� �����������/Desktop/projects/youtube_log/filter.py:11: 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

有什么问题?

【问题讨论】:

你是如何创建df2的?如果您输入了类似df2 = df1 的内容,则此错误来自以下事实:df2df1 的一部分,而不是整个对象本身。试试df2 = df1.copy() @ysearka df2 = df[df.id == 30013] 【参考方案1】:

您的df2 是另一个数据帧的一部分。您需要在尝试 drop 之前使用 df2 = df2.copy() 显式复制它

考虑以下数据框:

import pandas as pd
import numpy as np


df1 = pd.DataFrame(np.arange(20).reshape(4, 5), list('abcd'), list('ABCDE'))

df1

让我将df1 的一部分分配给df2

df2 = df1[['A', 'C']]

df2 现在是df1 的一部分,如果我们尝试更改df2 中的内容,应该会触发那些讨厌的SettingWithCopyWarning。一起来看看吧。

df2.drop('c')

没问题。怎么样:

df2.drop('c', inplace=True)

就是这样:

问题在于 Pandas 试图提高效率并跟踪 df2 指向与 df1 相同的数据。它正在维护这种关系。该警告告诉您,您不应该尝试通过切片来弄乱原始数据帧。

请注意,当我们查看 df2 时,“c”行已被删除。

df2

查看df1,我们看到“c”行仍然存在。

df1

pandas 复制了df2,然后删除了“c”行。这可能与我们的意图可能不一致,因为我们将df2 制作为df1 的一部分并指向与df1 相同的数据。所以熊猫是在警告我们。

要看不到警告,请自己制作副本。

df2 = df2.copy()
# or
df2 = df1[['A', 'C']].copy()

【讨论】:

感谢您的精彩解释! 如果不想复制但仍然删除消息,您可以设置它:pd.options.mode.chained_assignment = None 我可以对 pandas 说不在该语句中显示消息吗?我的意图确实是从切片中删除一行,而不是原始数据

以上是关于熊猫 SettingWithCopyWarning 的操作的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:SettingWithCopyWarning 触发位置

为啥我从熊猫那里得到 SettingWithCopyWarning

熊猫 SettingWithCopyWarning 的操作

尝试 .loc 后的熊猫 SettingWithCopyWarning

Python:SettingWithCopyWarning:试图在 DataFrame 中的切片副本上设置值

熊猫:链式作业[重复]