pandas如何逐行需改DataFrame

逐行修改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 的原理和解决方案

 

转载于:https://www.cnblogs.com/aaronhoo/p/11246881.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值