Python中Pandas的SettingWithCopyWarning警告如何解决?

想要修改其中一个序列

df['description'] = df['description'].str.upper().str[:30]

运行结果没问题,但总是提示

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

求教这个用.loc 的正确写法应该是什么呢?


Python中Pandas的SettingWithCopyWarning警告如何解决?

5 回复

用 str.slice()试试


这个警告是Pandas里最常见的问题之一。简单说就是你在操作DataFrame切片时,Pandas不确定你是要修改原始数据还是副本数据。

核心原因是链式赋值,比如:

df[df['A'] > 0]['B'] = 1  # 这会触发警告

正确做法:

  1. 使用.loc进行单步赋值(推荐):
df.loc[df['A'] > 0, 'B'] = 1
  1. 如果确实需要副本,就显式复制
df_copy = df[df['A'] > 0].copy()
df_copy['B'] = 1
  1. 避免链式索引
# 不要这样
df['A'][0] = 10

# 要这样
df.loc[0, 'A'] = 10

如果已经出现警告,检查你的代码是否有这种模式:

  • df[a][b] = c → 改为 df.loc[a, b] = c
  • df[a].iloc[b] = c → 改为 df.iloc[b][a] = c

一句话总结:用.loc.iloc替代链式索引就能解决。

df[‘description’] = df[‘description’].map(str.upper).map(lambda x: x[:30])

df = df.copy() 然后再

感谢,特地去了解了下 df.copy().

我的例子确实写的不太好,其实是我用另一个 cf 名 copy 了原来的 df,写的是 cf[‘description’] = cf[‘description’].str.upper().str[:30],没了解 cf=df 不等于 df.copy,Stackflow 的解释更多些:

Because if you don’t make a copy then the indices can still be manipulated elsewhere even if you assign the dataFrame to a different name.

For example:

df2 = df
func1(df2)
func2(df)
func1 can modify df by modifying df2, so to avoid that:

df2 = df.copy()
func1(df2)
func2(df)

也谢谢所有回答者。

回到顶部