pandas的dataFrame传入函数后发生了变化以及拷贝问题

今天发现,全局定义的pandas的DataFrame被传入到函数中的时候,如果函数改变了slice,比如df.loc[…,…] = x,全局变量df也会跟着变。险些造成错误计算,幸好发现及时。这里探讨一下这个问题的规避方法。

tl;dr:
使用的dataframe很大的情况下,复制列,在复制的列上进行想要的操作,如果很小,使用df.copy()。
更新,复制列有时会有bug,会弹出view vs copy警告,原因未知,建议使用df.copy()
更新,原因已查明。
当在函数中对df进行切片,即使使用了loc:

new_df = df.loc[cond]
new_df.loc[0,'col_name'] = 1

也会弹出警告,原因是new_df本质上还是df的切片,
包括像是(df.drop_duplicates这些方法都是切片)
new_df.loc[0,‘col_name’] = 1相当于 df.loc[cond].loc[0,‘col_name’] = 1
一旦出现给双重切片赋值,就会弹出警告,规避方法:

new_df = df.loc[cond].copy()
new_df.loc[0,'col_name'] = 1

takeaway:避免给双重切片赋值

首先是实验环节:定义dataframe

import pandas as pd

df = pd.DataFrame({
   'a':['z','x','c'],'b':[4,5,6]})
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值