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
相关产品推荐
相关产品推荐

