在我们日常的工作、学习当中,手里拿到的数据集通常是杂乱无章的,当中存在着不少的缺失值、极值、重复值以及数据类型不对等等类似的情况,今天小编就给大家介绍一种新的数据清洗的方法,可以大大地提高大家作为数据分析师、数据挖掘工程师工作的效率,但愿大家看过这篇文章之后会有所收获。
我们先新建一个数据集,通过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
结论
当然你也可以单独分开来使用这些函数以达到上面的目的,但是管道函数提供了一种更加高效率的使用方法,将多个功能组合到单个操作中去,也大大减少了代码的量级,提高了代码的整洁性。
历史文章
职场性骚扰、PUA、性别歧视?数说现在的打工人日子过得到底有多难
分享、收藏、点赞、在看安排一下?