分享一个更高效的数据清理方法,建议收藏

在我们日常的工作、学习当中,手里拿到的数据集通常是杂乱无章的,当中存在着不少的缺失值极值重复值以及数据类型不对等等类似的情况,今天小编就给大家介绍一种新的数据清洗的方法,可以大大地提高大家作为数据分析师、数据挖掘工程师工作的效率,但愿大家看过这篇文章之后会有所收获。

我们先新建一个数据集,通过pandas.DataFrame这个方法,

import pandas as pd
import numpy as np


df = pd.DataFrame({
    "A": [100, np.nan, 101, 102, 103, 104, 105, 106, 107],
    "B": [1, 2, 3, 4, 5, 2, np.nan, 5, 5],
    "C": [1120, 56, 48, np.nan, 62, 105, 54, 49, 2121],
    "D": [1.2, 1.3, 1.1, 1.8, np.nan, 1.4, 1.6, 1.9, 2.5],
    "E": ["1", "2", "3", "4", "5", "6", "7", "8", "10"],
    "F": ["2021-01-01", "2021-01-02", "2021-01-03", "2021-01-04", "2021-01-05",
          "2021-01-06", "2021-01-07", "2021-01-08", "2021-01-09",]
})

数据集长这个样子

我们可以看到上面的数据集当中第A列、B列、C列还有D列都有缺失值NaN,并且E列中的元素是字符串,F列中的元素是日期,但是也是字符串的形式,另外B列当中有好几个元素都是重复出现了的C列当中也有极值出现。我们接下来就对上面提到的问题进行一一处理

01

缺失值的处理

def fill_missing_values(df):
    for col in df.select_dtypes(include=["int", "float"]).columns:
        val = df[col].median()
        df[col].fillna(val, inplace = True)
    return df

小编个人比较偏向于用中位数来填充数据集中的缺失值,当然还有其他的例如平均数众数等统计指标来进行填充,具体情况具体分析

02

重复值的处理

def drop_duplicates(df, column_name):
    df = df.drop_duplicates(subset=column_name)
    return df

我们通过调用pandas模块当中的drop_duplicate函数,根据特定的某一列来去掉重复值

03

极值的处理

def remove_outliers(df, column_list):
    for col in column_list:
        avg = df[col].mean()
        std = df[col].std()
        low = avg - 2 * std
        high = avg + 2 * std
        df = df[df[col].between(low, high, inclusive=True)]
    return df

我们先是计算出特定一列的平均值标准差,然后计算出上限的值下限的值,最后我们剔除上限和下限以外的值

04

数据类型的转换

def convert_dtypes(df, column_name, to_type):
    df[column_name] = df[column_name].astype(to_type)
    return df
def convert_timeframe(df, column_name):
    df[column_name] = pd.to_datetime(df[column_name],
                                     format = "%Y-%m-%d")
    return df

通过panda模块当中的astype方法,我们可以将特定的某一列中的元素转换成我们想要的数据类型,另外我们也可以使用pandas模块当中的to_datetime方法,将字符串类型的数据转换时间日期格式

05

建立管道

我们现在有5个函数来进行数据清洗的任务,我们通过pipe方法来将这些函数依次串连起来形成一个管道。

df_processed = (df.pipe(fill_missing_values)
                .pipe(drop_duplicates, "B")
                .pipe(remove_outliers, ["A", "B"])
                .pipe(convert_dtypes, "E", "float")
                .pipe(convert_timeframe, "F"))

此管道会按照给定的顺序依次执行函数。我们也可以将参数函数名一起传递给管道。最后出来的结果是

数据类型也发生了变化

06

结论

当然你也可以单独分开来使用这些函数以达到上面的目的,但是管道函数提供了一种更加高效率的使用方法,将多个功能组合到单个操作中去,也大大减少了代码的量级,提高了代码的整洁性。

历史文章

干货分享 | 如何用Python来操作PDF文件,建议收藏

职场性骚扰、PUA、性别歧视?数说现在的打工人日子过得到底有多难

世界500强最新一轮排名出炉,最赚钱的行业竟然是它!?

数说“德尔塔”病毒,数据分析展示变异新冠毒株的传播情况

分享、收藏、点赞、在看安排一下?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值