今天发现,全局定义的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]})