如何防止对Pandas Dataframe 的原地操作?

l7wslrjt  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(151)

我试图写一个函数来填充Pandas Dataframe 中的缺失数据。函数的输入是一个 Dataframe ,其中包含缺失值和希望填充缺失值的列名,并且它将返回一个填充了缺失值的新 Dataframe 。问题是该函数还将填充输入 Dataframe 中的缺失值。这是我不打算做的。请看我的代码如下:

import pandas as pd
    import numpy as np
    from sklearn.impute import SimpleImputer
    table = pd.DataFrame({'feature1':[3,5,np.nan],'feature2':[4,1,np.nan],'feature3':   [6,7,3]})

    def missingValueHandle(dataframe,feature):
        df = dataframe
        df[feature] = df[feature].fillna(axis = 0, method = 'ffill')
        imp = SimpleImputer(strategy = 'mean')
        df = imp.fit_transform(df)
        return df

    new_dataframe = missingValueHandle(dataframe=table,feature = 'feature1')
    new_dataframe

| | 功能1|功能2|特辑3|
| - ------|- ------|- ------|- ------|
| 无|3.0版|4.0版|六个|
| 1个|5.0版|1.0分|七|
| 第二章|5.0版|钠氮|三个|

table

| | 功能1|功能2|特辑3|
| - ------|- ------|- ------|- ------|
| 无|3.0版|4.0版|六个|
| 1个|5.0版|1.0分|七|
| 第二章|5.0版|钠氮|三个|
如您所见,我的输入“table”随着输出“new_dataframe”而改变,我需要做些什么来防止这种情况发生?

qmb5sa22

qmb5sa221#

使用assign方法,而不是分配给传递的 Dataframe 。
.assign总是返回一个新的 Dataframe 。

def missingValueHandle(dataframe, feature):
  return (
    dataframe
    .assign(**{feature: lambda df: df[feature].ffill()})
    .pipe(SimpleImputer(strategy='mean').fit_transform))

在这种情况下,也可以不使用lambda:

def missingValueHandle(dataframe, feature):
  return (
    dataframe
    .assign(**{feature: dataframe[feature].ffill()})
    .pipe(SimpleImputer(strategy='mean').fit_transform))

lambda方法的好处是,您可以在assign之前的管道中添加一个行过滤器,它仍然可以工作

相关问题