【问题标题】:Is there a way to automate data cleaning for pandas DataFrames?有没有办法自动清理熊猫 DataFrames 的数据?
【发布时间】:2021-11-30 08:29:27
【问题描述】:

我正在清理机器学习项目的数据,方法是将缺失值分别替换为“年龄”和“票价”列的零和平均值。代码如下:

train_data['Age'] = train_data['Age'].fillna(0) 
mean = train_data['Fare'].mean()    
train_data['Fare'] = train_data['Fare'].fillna(mean)

由于我必须多次对其他数据集执行此操作,因此我想通过创建一个通用函数来自动化此过程,该函数将 DataFrame 作为输入并执行修改它并返回修改后的函数的操作。代码如下:

def data_cleaning(df):
    df['Age'] = df['Age'].fillna(0)
    fare_mean = df['Fare'].mean()
    df['Fare'] = df['Fare'].fillna()
    return df

但是当我通过训练数据DataFrame时:

train_data = data_cleaning(train_data)

我收到以下错误:

/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:2: 
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-  
docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_42/1440633985.py in <module>
      1 #print(train_data)
----> 2 train_data = data_cleaning(train_data)
      3 cross_val_data = data_cleaning(cross_val_data)

/tmp/ipykernel_42/3053068338.py in data_cleaning(df)
      2     df['Age'] = df['Age'].fillna(0)
      3     fare_mean = df['Fare'].mean()
----> 4     df['Fare'] = df['Fare'].fillna()
      5     return df

/opt/conda/lib/python3.7/site-packages/pandas/util/_decorators.py in wrapper(*args, 
**kwargs)
    309                     stacklevel=stacklevel,
    310                 )
--> 311             return func(*args, **kwargs)
    312 
    313         return wrapper

/opt/conda/lib/python3.7/site-packages/pandas/core/series.py in fillna(self, value, 
method, axis, inplace, limit, downcast)
   4820             inplace=inplace,
   4821             limit=limit,
-> 4822             downcast=downcast,
   4823         )
   4824 

/opt/conda/lib/python3.7/site-packages/pandas/core/generic.py in fillna(self, value, 
method, axis, inplace, limit, downcast)
   6311         """
   6312         inplace = validate_bool_kwarg(inplace, "inplace")
-> 6313         value, method = validate_fillna_kwargs(value, method)
   6314 
   6315         self._consolidate_inplace()

/opt/conda/lib/python3.7/site-packages/pandas/util/_validators.py in 
validate_fillna_kwargs(value, method, validate_scalar_dict_value)
        368 
        369     if value is None and method is None:
    --> 370         raise ValueError("Must specify a fill 'value' or 'method'.")
        371     elif value is None and method is not None:
        372         method = clean_fill_method(method)

    ValueError: Must specify a fill 'value' or 'method'.

在一些研究中,我发现我必须使用 apply() 和 map() 函数,但我不确定如何输入列的平均值。此外,这不能很好地扩展,因为我必须在将它们输入到函数之前计算所有的 fillna 值,这很麻烦。所以我想问一下,有没有更好的方法来自动化数据清洗?

【问题讨论】:

标签: python pandas data-cleaning


【解决方案1】:

在你的函数中这一行df['Fare'] = df['Fare'].fillna(),你没有用任何东西填充n/a,因此它返回一个错误。你应该把它改成df['Fare'] = df['Fare'].fillna(fare_mean)

如果您打算将其用于同一目录中的另一个文件,您可以通过以下方式在另一个文件中调用它:

from file_that_contain_function import function_name

如果您打算使其可在您的工作区/虚拟环境中重复使用,您可能需要创建自己的 python 包。

【讨论】:

  • 它显示在您在问题中输入的错误消息中,您确定不是问题/错误吗?
  • 对不起,我没注意到
  • 但是,我仍然收到警告
  • 你能告诉我警告吗?
  • 它与错误消息第一部分中显示的警告相同
【解决方案2】:

所以是的,另一个答案解释了 错误 的来源。

但是,开头的警告与填充NaN无关。警告告诉您正在修改数据框副本的一部分。将您的代码更改为

def data_cleaning(df):
    df['Age'] = df.loc[:, 'Age'].fillna(0)
    fare_mean = df['Fare'].mean()
    df['Fare'] = df.loc[:, 'Fare'].fillna(fare_mean)  # <- and also fix this error
    return df

我建议也在这里搜索该特定警告,因为有数百篇文章详细说明了此警告以及如何处理它。 Here's 不错。

【讨论】:

  • 感谢您的回答,但是,我仍然收到警告:/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: A value is trying设置在来自 DataFrame 的切片的副本上。尝试改用 .loc[row_indexer,col_indexer] = value
  • 不过,我对这个问题有所了解,会努力解决。
猜你喜欢
  • 2021-12-10
  • 2020-09-23
  • 1970-01-01
  • 2015-10-11
  • 2019-05-13
  • 1970-01-01
  • 2017-08-28
  • 2019-06-05
  • 2021-04-10
相关资源
最近更新 更多