逐行修改DataFrame而不会报SettingwithCopyWarning警告的方法:

df.iloc[行数,df.columns.get_loc(列名)]=new_value

参考:https://cloud.tencent.com/developer/ask/168023/answer/270064

逐行修改数据时,我们可能关注或只记得列名,这时使用df.iloc或者df.loc都不合适,因为是混合索引,但使用df.ix[行号,列名]=new_value又会报SettingwithCopyWarning,因此只能用上述方法,df.columns.get_loc(列名)这个方法会返回列名所在的列数,得到这个数值,就可以使用df.iloc了。

'''以下方式逐行修改数据,但由于需要读取、写入两个操作,会报警告
num=df.shape[0]
for i in range(num):
row=.iloc[i]
row['my_col']=(num+1)/num
df.iloc[i]=row
''' #以下方式不会报警,且避免了df.ix[index,column]已过时的警告
df.iloc[i,df.columns.get_loc('my_col')]=(num-i)/num

引申:df[布尔表达式]['my_col']=new_value 这样的写法为何会报SettingwithCopyWarning ?

因为这种写法存在修改副本(即类似表与视图的关系)的情况,其中df[布尔表达式]会返回一个df的子集副本,而['my_col']=new_value 是写入,是写入到副本,这种写入可能是无效的,因为副本不会自动保存到原始DataFrame。解决办法是使用df.loc或者df.iloc,且loc或iloc后面只使用一个中括号[],这样可以保证,df.loc[行索引,列名]=new_value直接操作原始表。

参考:Pandas 中 SettingwithCopyWarning 的原理和解决方案

最新文章

  1. 《The Evolution of Lua》读书笔记 1
  2. SqlServer 触发器
  3. B2B商城网站前端开发
  4. LightOj 1090 - Trailing Zeroes (II)---求末尾0的个数
  5. BootStrap中Affix控件的使用方法及如何保持布局的美观
  6. PHP 判断协议是否为HTTPS
  7. hadoop的相关资料链接
  8. C# 分析搜索引擎url 得到搜索关键字
  9. 浅谈Android中的组播(多播)
  10. Numpy库的学习(四)
  11. emmet-前端开发神器的几种写法
  12. [JavaScript] - replaceAll,将字符串中的字母或数字等全部替换掉的方式
  13. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
  14. java中钩子方法的概念
  15. linux报错 find: missing argument to `-exec'
  16. 02: SocketServer服务
  17. Educational Codeforces Round 25 C. Multi-judge Solving
  18. cloudera manager安装hive注意事项,提示连不上数据库,没有user目录权限
  19. C# EMS Client
  20. easyui -validatebox 验证框加载

热门文章

  1. 虚拟化云计算平台Proxmox VE
  2. 在linux上搭建nacos集群(步骤详细,linux小白也搞得定)
  3. 简单模拟实现Rxjs Observable
  4. LoadRunner安装时提示缺少C++ 2005 SP1(x86)插件
  5. E. Count The Blocks
  6. 2249: Altruistic Amphibians 01背包
  7. layui里面的layer模块弹窗,强制居中的方法!!!
  8. 【Scala】关于集合的各种知识点
  9. SVN 报错问题
  10. css布局的漂浮、position定位