Pandas函数内DataFrame变更未生效:调用test函数仅第一个函数生效
问题成因
有两个核心原因共同导致了该问题:
- 第一是函数执行顺序逻辑错误:你在
test函数中先调用missing函数把DataFrame里所有的空值填充为0,原本全为空值的列经过填充后已经全部变为0,后续再调用drop_nan_columns删除全空列时,已经没有符合条件的列,自然不会产生任何修改效果 - 第二是
drop_nan_columns的代码写法存在错误:df.dropna方法设置inplace=True时,会直接修改原DataFrame对象,返回值为None,你把返回的None赋值给了函数内部的局部变量df,虽然本次操作中因为inplace已经先修改了原对象不会直接导致问题,但这种写法非常不规范,一旦后续调整代码去掉inplace参数,就会直接导致修改无法同步到原对象。
解决方法
第一步:调整函数执行顺序
把删除全空列的操作放到填充空值操作之前,避免全空列被提前填充导致无法识别:
def test (df): drop_nan_columns(df) missing(df) return df
第二步:修正drop_nan_columns的错误写法
有两种可选修正方案:
方案1:保留inplace参数,删除多余赋值
去掉df = 的赋值操作,直接调用dropna方法即可,这是改动最小的修正方式:
def drop_nan_columns(df): df.dropna(axis = 1, how = "all", inplace = True)
方案2:移除inplace参数,返回修改后的对象
这种写法更符合Pandas官方的推荐规范,inplace参数因为存在较多隐性问题已经被官方标记为待废弃属性,新的Pandas版本中很多方法已经逐步取消inplace参数支持:
首先修改drop_nan_columns函数:
def drop_nan_columns(df): return df.dropna(axis = 1, how = "all")
再同步调整test函数的调用逻辑:
def test (df): df = drop_nan_columns(df) missing(df) return df
内容的提问来源于stack exchange,提问作者Marinos Papamichael
相关产品推荐
相关产品推荐

