Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1280|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    5 天前
  • 签到天数: 803 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726482
    发表于 2021-4-14 11:45:45 | 显示全部楼层 |阅读模式

    转载:y小川

    SettingWithCopyWarning 解决方案

    问题场景:我在读取csv文件之后,因为要新增一个特征列并根据已有特征修改新增列的值,结果在修改的时候就碰到了SettingWithCopyWarning这个警告,花了很长时间才解决这个问题。

    一个简易版的范例

    import pandas as pd
    import numpy as np
    
    aa = np.array([1, 0, 1, 0])
    bb = pd.DataFrame(aa.T, columns=['one'])
    print(bb)

    输出为:

    添加一个新列后在输出

    bb['two'] = 0
    print(bb)
    
    output[]:
       one  two
    0    1    0
    1    0    0
    2    1    0
    3    0    0

    按条件修改新列再输出就报错了:

    for i in range(bb.shape[0]):
        if bb['one'] == 0:
            bb['two'] = 1
    print(bb)
    
    output[]:
    C:/PycharmProjects/NaiveBayesProduct/pandas/try_index.py:22: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame
    
    See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
      bb['two'] = 1
       one  two
    0    1    0
    1    0    1
    2    1    0
    3    0    1

    这个问题怎么解决呢,我查了stackoverflow上的很多帖子,试了loc/iloc等函数都不管用,最后才发现是顺序错了。正确方案应该是生成好正确的数组再插入dataframe中。下面我把上面的例子用正确地方法再重新生成一遍。

    import pandas as pd
    import numpy as np
    
    aa = np.array([1, 0, 1, 0])
    bb = pd.DataFrame(aa.T, columns=['one'])
    # 生成一个ndarray,装要插入的值
    two = np.zeros(bb.shape[0])
    # 按条件修改two
    for i in range(bb.shape[0]):
        if bb['one'] == 0:
            two = 1
    # 完成后将two插入dataframe中
    bb.insert(1,'two', two)
    print(bb)
    
    output[]:
       one  two
    0    1  0.0
    1    0  1.0
    2    1  0.0
    3    0  1.0

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-22 03:24 , Processed in 2.163312 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表