Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]

Posted

技术标签:

【中文标题】Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]【英文标题】:Pandas DataFrame: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame [duplicate] 【发布时间】:2018-09-18 14:02:35 【问题描述】:

我知道有很多关于此警告的帖子,但我找不到解决我的情况的方法。这是我的代码:

df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int)
#df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int).copy()
#df.loc[:, 'my_col'] = df['my_col'].astype(int)

它会产生警告:

SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的价值

即使我按照建议更改了代码,我仍然收到此警告?我需要做的就是转换一列的数据类型。

**备注:**最初该列是具有一位小数的浮点类型(例如:4711.0)。因此,我将其更改为整数 (4711),然后更改为字符串 ('4711') - 只是为了删除小数。

感谢您的帮助!

更新:警告是对之前完成的原始数据过滤的副作用。我错过了 DataFrame.copy()。改用副本,解决了问题!

df = df[df['my_col'].notnull()].copy()
df.loc[:, 'my_col'] = df['my_col'].astype(int).astype(str)
#df['my_col'] = df['my_col'].astype(int).astype(str) # works too!

【问题讨论】:

这个错误有点混乱,显然问题是df.loc[:, 'my_col'] = df.loc[:, 'my_col'].astype(int)之前的代码行 前一行来自上周的my question:df = df[df['my_col'].notnull()] 显然问题出在过滤上,需要df = df[df['col'] > 10].copy() 那么df = df[df['my_col'].notnull()].copy() 工作怎么样? @jezrael 你是我今天的英雄。就是这样! 【参考方案1】:

我认为选择列需要copy 并省略loc

df = df[df['my_col'].notnull()].copy()
df['my_col'] = df['my_col'].astype(int).astype(str)

解释

如果您稍后修改 df 中的值,您会发现修改不会传播回原始数据 (df),并且 Pandas 会发出警告。

【讨论】:

【参考方案2】:

另一种方法是禁用链式分配,它适用于您的代码无需创建副本

# disable chained assignments
pd.options.mode.chained_assignment = None 

【讨论】:

【参考方案3】:

如果您需要更改单个列的数据类型,直接寻址该列会更容易:

df['my_col'] = df['my_col'].astype(int)

或者使用.assign

df = df.assign(my_col=lambda d: d['my_col'].astype(int))

.assign 非常有用,如果您只需要转换一次,并且不想在该范围之外更改您的df

【讨论】:

不,我在使用您的第一行代码时收到了同样的警告。请参阅我原始帖子中的评论行。第二个不可用,因为列的名称是一个静态变量,不能在赋值语句中使用。 对不起,你是对的。第一行有效。我警告的问题是对原始数据的过滤。更新了我的帖子! 您可以在assign 语句中使用动态变量名称,方法是传递一个字典并在其上使用**:例如df.assign(**x: 1),假设x 的内容是一个有效的Python 标识符.

以上是关于Pandas DataFrame:SettingWithCopyWarning:试图在 DataFrame 的切片副本上设置一个值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

将 Pandas Multiindexed DataFrame 与 Singleindexed Pandas DataFrame 合并

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

python pandas dataframe 写入hdfs

pandas怎么选取dataframe中几列

详解pandas获取Dataframe元素值的几种方法