为什么df.dropna(inplace=True)和df = df.dropna()运行结果不同
pandas dropna两种写法效果差异原因
首先两种写法的缺失值过滤逻辑是完全一致的,出现效果差异的核心原因是Python变量指向逻辑和pandas方法的返回值机制不同:
df.dropna(inplace=True)的执行逻辑:开启inplace参数后,pandas会直接修改当前df变量指向的内存中存储的原DataFrame对象,不会生成新对象,所以你查看原变量时能直接看到修改效果。df = df.dropna()的执行逻辑:dropna默认inplace=False,会先基于原DataFrame计算出过滤后的结果,生成一个全新的DataFrame对象,你写的赋值操作只是把当前作用域下的df变量名,从指向旧对象改成了指向这个新生成的对象,旧的DataFrame对象本身没有发生任何修改。
常见踩坑场景示例
场景1:函数内赋值未返回
如果是在自定义函数中使用赋值写法,没有把新对象返回并在外部重新接收,就会出现原df未修改的情况:
import pandas as pd def clean_data(input_df): # 仅修改了函数内局部变量input_df的指向,外部传入的原对象不受影响 input_df = input_df.dropna() # 调用函数 origin_df = pd.DataFrame({"col1": [1, None, 3, 4]}) clean_data(origin_df) print(origin_df) # 输出仍带有NaN,未被修改
场景2:多变量指向同一原对象
如果有多个变量指向同一个原始DataFrame,仅对其中一个变量做重新赋值,其他变量仍然会指向未修改的旧对象:
df_a = pd.DataFrame({"col1": [1, None, 3, 4]}) df_b = df_a # 仅修改df_a的指向到新对象,df_b仍然指向旧对象 df_a = df_a.dropna() print(df_b) # 输出仍带有NaN,未被修改
赋值写法的正确使用方式
如果要使用官方更推荐的无inplace写法,只要记得将处理后的新对象重新赋值给你需要使用的变量即可:
# 直接处理全局变量 origin_df = pd.DataFrame({"col1": [1, None, 3, 4]}) origin_df = origin_df.dropna() print(origin_df) # 此时NaN已经被正确移除 # 函数中使用的写法 def clean_data(input_df): input_df = input_df.dropna() return input_df origin_df = clean_data(origin_df)
内容的提问来源于stack exchange,提问作者TOS
相关产品推荐
相关产品推荐

