dataframe插入数据报错SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a

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)
   one
0    1
1    0
2    1
3    0
bb['two'] = 0
print(bb)
   one  two
0    1    0
1    0    0
2    1    0
3    0    0

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

for i in range(bb.shape[0]):
    if bb['one'][i] == 0:
        bb['two'][i] = 1
print(bb)

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'][i] = 1
   one  two
0    1    0
1    0    1
2    1    0
3    0    1

解决方案

正确方案应该是生成好正确的数组再插入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'][i] == 0:
        two[i] = 1
# 完成后将two插入dataframe中
bb.insert(1,'two', two)  
 #insert 三个参数,插到第几列,该列列名,如果是bb.insert(0,'two', two),插入到第一列,
print(bb)

   one  two
0    1  0.0
1    0  1.0
2    1  0.0
3    0  1.0

个人代码

个人案例代码:在进行利用朴素贝叶斯网络进行对评论进行分类的过程中,正向定义为1,负向定义为0.插入评论分析结果时报错

comm_data=pd.read_csv("C:\\Users\\lenovo\\Desktop\\comm\\new_data.csv",encoding="utf-8")
        # comm_data=new_data
        print(comm_data.head(5))
        comm_data["classify"]="#"
        for c in range(len(comm_data)):
            classify=testingNB(comm_data["content"][c])
            # print(classify)
            comm_data["classify"][c]=classify
        comm_data.to_csv("C:\\Users\\lenovo\\Desktop\\comm\\comm_data.csv")

出现报错:

D:/office3/python/python_py/compare/score_variance/get_data/web5_data_mg.py:161: 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
  comm_data["classify"][c]=classify

解决方案;

    comm_data=pd.read_csv("C:\\Users\\lenovo\\Desktop\\comm\\new_data.csv",encoding="utf-8")
        # comm_data=new_data
        print(comm_data.head(5))
        # comm_data["classify"]="#"
        classify= np.zeros(comm_data.shape[0])
        for c in range(len(comm_data)):
            classifynb=testingNB(comm_data["content"][c])
            # print(classify)
            # comm_data["classify"][c]=classify
            classify[c]=classifynb
        comm_data(0,'classify', classify)
        comm_data.to_csv("C:\\Users\\lenovo\\Desktop\\comm\\comm_data.csv")

这样问题就解决了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LEo的网络日志

关于单元测试(go)

3628
来自专栏kangvcar

MongoDB 入门极简教程

1111
来自专栏数据库新发现

Use bonnie++ to Test system IO speed[修正稿]

http://www.eygle.com/unix/Use.Bonnie++.To.Test.IO.speed.htm

1032
来自专栏韩东吉的Unity杂货铺

零基础入门 24:Unity设计模式之单键模式

Hello,各位小伙伴,上一篇结束以后,Unity里的UGUI系列分享就已经结束了,不知道大家是否已经灵活掌握运用了呢?

1871
来自专栏分布式系统和大数据处理

C#网络编程(同步传输字符串) - Part.2

在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可...

1263
来自专栏肖蕾的博客

第十三章:图片资源打包器(TexturePacker)TexturePacker介绍TexturePacker 下载使用TextureAtlaspack文件格式

1.介绍:TexturePacker 是一款把若干张资源图片拼接为一张大图的工具。 2.特点: - 1.提高载入速度 把小图拼接成一张大图,一次载入,减少...

1844
来自专栏Python

自定义 Django的User Model,扩展 AbstractUser类注意事项

本篇主要讨论一下User Model的使用技巧. 注意, 由于Django 1.5之后user model带来了很大的变化, 本篇内容只针对django 1.5...

9902
来自专栏开发 & 算法杂谈

MultiRace-Efficient on-the-fly data race detection

     最近在研究数据竞争检测方法,之前的工作是参考了Eraser这个工具1997年提出的基于Lockset方法的动态数据检测,

912
来自专栏哲学驱动设计

性能优化总结(三):聚合SQL在GIX4中的应用

本节主要介绍,在GIX4系统中,如何应用上篇讲的方案来改善性能,如果与现有的系统环境集成在一起。大致包含以下内容: SQL的生成 映射-数据读取方案 工厂方法-...

2106
来自专栏ChaMd5安全团队

【首发】记DedeCMS一处由哈希长度拓展攻击引起的越权漏洞

漏洞影响:Dedecms(织梦CMS) V5.7.72 正式版20180109 (最新版)

2083

扫码关注云+社区

领取腾讯云代金券