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

Python引用语义困惑:Pandas删除DataFrame缺失值无效问题求助

问题原因与解决方案:Pandas函数中删除缺失值不生效

嘿,你猜的没错,这个问题确实和Python的变量引用与赋值逻辑有关,我来给你讲明白到底咋回事~

核心原因:局部变量的赋值不影响外部对象

你写的DropNan函数里,Data1 = Data1.dropna()这行代码其实只是做了一件事:

  • 首先调用dropna()会生成一个新的DataFrame对象(因为Pandas的大部分方法默认都是返回新对象,不修改原对象)
  • 然后把这个新对象的引用赋值给函数内部的局部变量Data1

但这个局部变量Data1和你在函数外面定义的Data1只是同名而已,它们指向的是不同的对象。函数执行完之后,局部变量就被销毁了,外面的原始Data1完全没被碰过,所以缺失值自然还在。

简单来说:你在函数里只是给“本地副本”重新赋值了,根本没触碰到原始数据。

两种解决方案

方案1:让函数返回处理后的DataFrame(推荐)

这种方式更符合Python的函数设计习惯,函数接收原始数据,返回处理后的新数据,不会修改原始对象,更安全可控。

修改后的代码:

import pandas as pd

# 读取原始数据
Data1 = pd.read_csv(r"C:\Users\Zihao\Desktop\New\OBSTET.csv")
Data2 = pd.read_csv(r"C:\Users\Zihao\Desktop\New\PRODUCTOS.csv", index_col = 0)

def DropNan(df1, df2):
    # 对两个DataFrame执行dropna,返回新对象
    cleaned_df1 = df1.dropna()
    cleaned_df2 = df2.dropna()
    return cleaned_df1, cleaned_df2

# 调用函数并将返回值重新赋值给原始变量
Data1, Data2 = DropNan(Data1, Data2)

方案2:使用inplace=True原地修改(不推荐)

如果你确实想直接修改原始DataFrame,可以用dropna()的inplace=True参数,它会直接在原对象上修改,而不是返回新对象。不过这种方式容易产生意外副作用(比如你之后需要原始带缺失值的数据就找不回来了),所以一般不推荐。

代码示例:

import pandas as pd

Data1 = pd.read_csv(r"C:\Users\Zihao\Desktop\New\OBSTET.csv")
Data2 = pd.read_csv(r"C:\Users\Zihao\Desktop\New\PRODUCTOS.csv", index_col = 0)

def DropNan(df1, df2):
    # 原地修改传入的DataFrame
    df1.dropna(inplace=True)
    df2.dropna(inplace=True)

# 调用函数后,原始Data1和Data2已经被修改
DropNan(Data1, Data2)

再补个小知识点

Python的参数传递是“传对象引用”:

  • 当你把一个对象(比如DataFrame)传给函数时,函数参数拿到的是这个对象的引用
  • 如果在函数里修改对象本身的内容(比如调用inplace方法、给列表追加元素),外部的对象会跟着变
  • 但如果是给参数重新赋值(比如df1 = df1.dropna()),只是改变了局部变量的指向,和外部的原始对象就没关系了

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:31:53