python 数据清洗 豆瓣电影_一文搞懂常见的 Python 数据清洗

论坛 期权论坛 脚本     
匿名技术用户   2021-1-10 18:09   10291   0

在数据分析中,我们会遇到各种各样的数据,在分析前,要投入大量的时间和精力把数据整理成自己想要或需要的样子。

为什么呢?因为我们采集到的数据往往有很多问题。

import pandas as pd

import numpy as np

data = {

'id':['1','2','3','4',np.nan,'5','6'],

'name':['mouse','Mini','McDuck','Pink',np.nan,'Huey','Huey'],

'age':[56.0,56.0,23.0,32.0,np.nan,152.0,152.0],

'Weight':['70kgs','154.89lbs',np.nan,'78kgs',np.nan,'198.658lbs','198.658lbs']

}

df = pd.DataFrame(data)

print(df)示例数据

这一份简单的数据,我们一眼就能看出很多问题。日常工作中的数据业务会复杂很多,通常我们要统计更多的数据维度,数据量也可能会更大,比如超过TB、EB级别。所以,这就造成数据分析的处理难度呈指数级增加的。此时,想仅仅通过肉眼就很难定位到问题所在了。

通常来说,一个好的数据分析师,必定是一名数据清洗高手。其实,有经验的数据分析师都知道,在整个数据分析过程中,数据清洗花费的时间都可能会占到了总项目时长的80%左右。

一、数据质量准则

在这里,我们归类成了“完全合一”4项准则,按照以上的原则,我们能解决数据清理中遇到的大部分问题,使得数据标准、干净、连续,为后续数据统计、数据挖掘做好准备。完整性:单条数据是否存在空值,统计的字段是否完善。

全面性:观察某一列的全部数值。比如在Excel表中,我们选中一列,可以看到该列的平均值、最大值、最小值。我们可以通过常识来判断该列是否有问题。比如:数据定义、单位标识、数值本身。

合法性:数据的类型、内容、大小的合法性。比如数据中存在非ASCII字符等,性别存在了未知,年龄超过了150岁等。

唯一性:数据是否存在重复记录,因为数据通常来自不同的渠道汇总,重复的情况是常见的。行数据、列数据都需要是唯一的,比如一个人不能重复记录多次,且一个人的体重也不能在列指标中重复记录多次。

二、数据清洗实战案例

1、完整性

主要问题:缺失值。针对缺失值的处理,主要有:删除、填充等。

删除:删除数据缺失的记录;其优点在于简单易行,但缺点同样突出,删除缺失记录丢弃了隐藏在缺失值中的信息。删除缺失值,适用于缺失样本较少,总样本量足够大,被删除的样本量在总样本中占比极小。

# 删除全空的行

df.dropna(how='all',inplace=True)

填充:可使用均值、众数、特殊值、机器学习算法(KNN、聚类...)等;

# 平均年龄进行填充

df['age'].fillna(df['age'].mean(), inplace=True)

# 使用众数进行填充

age_maxf = df['age'].value_counts().index[0]

df['age'].fillna(age_maxf, inplace=True)

至于到底使用删除缺失值、还是填充缺失值,用哪种方法填充,得根据实际应用场景而定。

2、全面性问题

观察上面例子中,weight 列的数值,我们能发现 weight 列的单位不统一。有的单位是千克(kgs),有的单位是磅(lbs)。这里使用千克作为统一的度量单位,将磅(lbs)转化为千克(kgs):

deal_data = df['Weight'].str.contains('lbs').fillna(False)

# 将 lbs 转换为 kgs,2.21lbs = 1kgs

for i ,lbs_row in df[deal_data].iterrows():

# iterrows() 是在数据框中的行进行迭代的一个生成器,它返回每行的索引及一个包含行本身的对象

weight = int(float(lbs_row['Weight'][:-3])/2.2)

df.at[i,'Weight'] = '{}kgs'.format(weight)

# df.at 的作用:获取某个位置的值,例如:获取第0行、第a列的值,即:index = 0,columns = 'a', data = df.at[0, 'a']

3、合理性

上例中,年龄超过150岁?合理吗?此处,可以做删除或者填充处理!上文已描述,此处不再赘述!

4、唯一性

# 使用 Pandas 提供的 drop_duplicates() 删除重复数据

df.drop_duplicates(['name','age'],inplace=True)

通过上面的小例子,就能感受到数据问题不是小事,就上面这个简单的例子里都有好几处错误。而且,在实际工作场景中,很多数据都是脏数据,需要清洗。可以说,没有高质量的数据,就没有高质量的数据分析、数据挖掘,而数据清洗是高质量数据的一道保障。

当从事数据分析、数据挖掘类工作的时候,你会发现养成数据审核的习惯,真的非常重要!!!

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP