赞
踩
经过数据采集得到的数据,通常情况下是无法直接拿来用的,因为可能存在缺失值、空行、重复行等等诸多问题。因此需要对采集得到的数据做一些必要的处理,也就是数据清洗。就好比炒菜一样,大部分时间都花在准备上,如买菜、择菜、洗菜等。在整个数据分析过程中,不论是 在时间还是 功夫上,数据清洗大概占到了80%。
那么,当接到一份“新鲜”数据后,该如何着手进行数据清洗呢?有没有什么流程、方法之类的知识可以让人快速上手数据清洗呢?又如何才能得到干净、标准、连续的数据呢?这里介绍一种叫做“完全合一”的四项原则。按照“完全合一”原则进行操作,可以帮助我们解决数据清理中遇到的大部分问题。
# 导入练习数据
import pandas as pd
from pandas import Series, DataFrame
path = './data/data7_example.csv'
df1 = DataFrame(pd.read_csv(path))
print(df1)
output:
1 micky mouse 56 70kgs 72 69 71 - -.1 -.2
0 2.0 donald duck 34.0 154.89lbs - - - 85 84 76
1 3.0 mini mouse 16.0 NaN - - - 65 69 72
2 4.0 scrooge mcduck NaN 78kgs 78 79 72 - - -
3 5.0 pink panther 54.0 198.658lbs - - - 69 NaN 75
4 6.0 huey mcduck 52.0 189lbs - - - 68 75 72
5 7.0 dewey mcduck 19.0 56kgs - - - 71 78 75
6 8.0 scoopy doo 32.0 78kgs 78 76 75 - - -
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8 9.0 huey mcduck 52.0 189lbs - - - 68 75 72
9 10.0 louie mcduck 12.0 45kgs - - - 92 95 87
练习数据可以到我的Github下载,当然你也可以按照需求自己做一个.
经过观察,可以明显地发现,这份数据存在有缺失值、有空行、没有字段名、数据标识(单位)不统一、存在重复数据这些问题。下面按照“完全合一”的原则对这份数据进行清洗。
在实际业务中,往往因为数据量较大,会出现有些数据没有采集到的情况。通常我们可以采用以下三个方法进行处理:
删除:删除数据缺失的记录
均值:使用当前列的均值
高频:使用当前列出现频率最高的数据
# 补全列名 df2 = DataFrame( pd.read_csv( path, names=[ 'Order', 'Name', 'Age', 'Weight', 'm0006', 'm0612', 'm1218', 'f0006', 'f0612', 'f1218' ])) df2.dropna(how='all', inplace=True) # 对Age列缺失值进行填充,这里使用了均值 df2['Age'].fillna(df2['Age'].mean(), inplace=True) # 删除空行并打印 df2.dropna(how='all', inplace=True) print(df2)
# 获取weight列中单位为lbs的数据
rows_with_lbs = df2['Weight'].str.contains('lbs').fillna(False)
print(df2[rows_with_lbs])
# 将lbs转换为kgs,2.2lbs=1kgs
for i, lbs_row in df2[rows_with_lbs].iterrows():
# 截取从头开始至倒数第三个字符之前的数据,也就是去掉最后的lbs
weight = int(float(lbs_row['Weight'][:-3]) / 2.2)
df2.at[i, 'Weight'] = '{}kgs'.format(weight)
print(df2)
# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
# 拆分Name列,删除原数据列
# df2.insert(1, 'FristName', df2['Name'].map(lambda x: x.split(' ')[0]))
# df2.insert(2, 'LastName', df2['Name'].map(lambda x: x.split(' ')[1]))
# del df2['Name']
# print(df2)
df2[['first_name','last_name']]=df2['Name'].str.split(expand=True)
df2.drop('Name',axis=1,inplace=True)
print(df2)
# 删除重复数据行
df2.drop_duplicates(['first_name','last_name'], inplace=True)
print(df2)
没有高质量的数据,就没有高质量的数据挖掘,而数据清洗是高质量数据的一道保障.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。