You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:45:01