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比较快