解决bug: A value is trying to be set on a copy of a slice from a DataFrame

本文介绍了在Python中处理PandasDataFrame时遇到的SettingWithCopyWarning错误,重点讲解了如何通过正确使用`df.loc`而非直接赋值来避免此警告,确保数据操作的正确性。
部署运行你感兴趣的模型镜像

在使用DataFrame赋值的时候,报错如下:

E:/1、荣数/工单周报/运行程序/1:27: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df['创建时间2'][i]=datetime.strptime(df['创建时间'][i].split(' ')[0], "%Y-%m-%d")

经查发现错误是由于df的赋值引起的

for i in df.index:
    if df['完成时间'][i] is not np.nan:
        df['创建时间2'][i]=datetime.strptime(df['创建时间'][i].split(' ')[0], "%Y-%m-%d")
        df['完成时间2'][i]= datetime.strptime(df['完成时间'][i].split(' ')[0],"%Y-%m-%d")

正确的赋值方式:

df.loc[‘行标签’,‘列标签’] 来赋值

for i in df.index:
    if df['完成时间'][i] is not np.nan:
        df.loc[i,'创建时间2']=datetime.strptime(df['创建时间'][i].split(' ')[0], "%Y-%m-%d")
        df.loc[i,'完成时间2']= datetime.strptime(df['完成时间'][i].split(' ')[0],"%Y-%m-%d")

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

您看到的警告: ``` SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame ``` 虽然是**警告(Warning)而非错误(Error)**,但它提示了一个潜在风险: > 您正在一个可能是“视图”(view)而不是独立副本的数据上进行修改,可能导致操作无效或行为不可预测。 --- ### 🔍 问题根源 当您执行: ```python data = df[df['CO2'] != -99.99] data.dropna(subset=['Yr', 'Mn', 'CO2'], inplace=True) ``` pandas 无法确定 `data` 是 `df` 的独立副本还是引用(视图),因此在后续使用 `inplace=True` 修改它时发出警告。 即使数据清洗正确,这种写法也容易引发 bug。 --- ### ✅ 正确解决方案:显式使用 `.copy()` 只需在过滤后立即创建副本,即可彻底消除警告: ```python data = df[df['CO2'] != -99.99].copy() # 明确声明这是一个新对象 data.dropna(subset=['Yr', 'Mn', 'CO2'], inplace=True) ``` 这样 pandas 就知道 `data` 是一个独立 DataFrame,可以安全修改。 --- ### ✅ 推荐完整修复代码片段 ```python # 清洗数据:排除 CO2 为 -99.99 的行,并显式创建副本 data = df[df['CO2'] != -99.99].copy() # 删除 Yr、Mn、CO2 中仍有 NaN 的行 data.dropna(subset=['Yr', 'Mn', 'CO2'], inplace=True) # 可选:再次 copy 确保安全(进一步保险) data = data.copy() ``` --- ### 🧠 为什么需要 `.copy()`? | 写法 | 含义 | 是否安全 | |------|------|---------| | `data = df[...]` | 可能是视图 | ❌ 不安全 | | `data = df[...].copy()` | 明确副本 | ✅ 安全 | 使用 `.copy()` 后,`data` 与原始 `df` 完全分离,任何修改都不会影响原数据,也不会触发警告。 --- ### ✅ 验证效果 加入以下调试语句确认无误: ```python print("data 是否为副本:", data._is_copy is None) # 若为 None,说明已脱离原 df ``` 或者直接忽略该信息——只要用了 `.copy()`,警告就消失且操作安全。 --- ### 🔚 总结 > ⚠️ 警告原因:未明确声明 `data` 是独立副本。 > ✅ 解决方法:在索引后添加 `.copy()`。 修改一行即可解决: ```python data = df[df['CO2'] != -99.99].copy() # 加上 .copy() ``` 从此不再出现 `SettingWithCopyWarning`,代码更健壮、专业。 --- ### 🔍 知识点 1. **`.copy()` 的作用** 创建独立副本,避免在“视图”上修改引发警告。 2. **`inplace=True` 的前提** 应用于独立副本时才安全可靠。 3. **`pd.to_numeric` + `dropna` + `.copy()` 组合** 数据清洗三件套,确保类型正确、无缺失、无副作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值