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

函数内执行Pandas DataFrame预处理后数据无变化的问题排查

问题分析与解决方案

嘿,我一眼就看出问题出在哪了——你的预处理函数没有返回处理后的DataFrame,而且中间的操作还创建了新的对象,导致外部的原始DataFrame根本没拿到修改后的结果!

核心问题拆解

  • 当你执行df = df.drop_duplicates()时,你其实是创建了一个全新的DataFrame实例,函数内部的df变量现在指向这个新对象,但你传入的原始DataFrame(比如调用时的train_df)仍然指向原来的旧对象,两者已经没关系了。
  • 后面的drop(..., inplace=True)确实在修改这个新对象,但因为你没把这个新对象返回给外部,函数执行完后,这个新对象就被丢弃了,外部自然看不到任何变化。
  • 另外,函数里的df.head()、df.shape这些语句只是默默执行,不会输出任何结果——如果你想看到这些调试信息,得加上print()才行。

修正后的代码

我帮你调整了代码,加上了返回逻辑,同时优化了调试输出:

import numpy as np
import pandas as pd

# 创建预处理函数,可应用于任意数据集(训练集、验证集及竞赛数据集)
def preprocessing(df):
    # 查看DataFrame前几行(添加print输出)
    print("初始前5行:")
    print(df.head())
    # 查看DataFrame中的数据类型
    print("\n数据类型:")
    print(np.unique(df.dtypes).tolist())
    # 查看去重前的DataFrame形状
    print("\n去重前形状:", df.shape)
    
    # 删除重复值(这里保留赋值,后续返回新对象)
    df = df.drop_duplicates()
    # 再次查看形状以确认变化
    print("\n去重后形状:", df.shape)
    
    # 计算均值为100的行索引,后续删除这些行
    mean100_rows = [i for i in range(len(df)) if df.iloc[i,0:520].values.mean() == 100 ]
    # 计算均值为100的列索引,后续删除这些列
    mean100_cols = [i for i in np.arange(0,520,1) if df.iloc[:,i].values.mean() == 100 ]
    # 获取均值为100的列标签,后续删除这些列
    col_labels = [df.columns[i] for i in mean100_cols]
    
    # 删除均值为100的行(这里可以不用inplace,直接赋值)
    df = df.drop(index=mean100_rows, axis=0)
    # 删除均值为100的列
    df = df.drop(columns=col_labels, axis=1)
    
    # 导出已删除的列标签
    pd.Series(col_labels).to_csv('remove_cols.csv')
    
    # 查看处理后的前几行
    print("\n处理后前5行:")
    print(df.head())
    # 再次查看DataFrame形状
    print("\n最终形状:", df.shape)
    
    # 关键:返回处理后的DataFrame
    return df

正确调用方式

现在你需要这样调用函数,把返回的新DataFrame赋值给变量:

# 假设你的原始DataFrame叫original_df
processed_df = preprocessing(original_df)

额外小贴士

如果你更倾向于直接修改原始DataFrame(不创建新对象),可以把所有赋值操作改成inplace=True,比如:

df.drop_duplicates(inplace=True)
df.drop(index=mean100_rows, axis=0, inplace=True)
df.drop(columns=col_labels, axis=1, inplace=True)

这种情况下函数可以不用返回值,但这种方式在复杂操作中容易引发意外(比如链式操作时的对象引用问题),所以更推荐返回新对象的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:55:10