1,加载excel文件为数据框
# 加载数据处理包pandas ,同时重命名为pd,以便后续简写方便
import pandas as pd
# 单独用一个变量存储文件名,一来便于代码重复利用,二来修改更方便
filenameStr = '/Users/chaorenbuhuifei/Downloads/第4关数据分析的基本过程/朝阳医院2018年销售数据.xlsx'
#pandas的ExcelFile 方法读取excel文件,参数 dtype = 'object' 保证正确读取所有数据
xls = pd.ExcelFile(filenameStr,dtype = 'object')
salesDf = xls.parse('Sheet1',dtype = 'object')
salesDf.head()
如果数据集过大,仅仅想处理数据集的一小部分内容则通过loc函数进行子集筛选
subSalesDf = salesDf.loc[0:10,'社保卡号':'实收金额']
subSalesDf
subSalesDf01 = salesDf.loc[0:10,['社保卡号','实收金额']]
subSalesDf01
subSalesDf02 = salesDf.loc[[0,1,9],['社保卡号','实收金额']]
subSalesDf02
2,列名重命名
通过数据框的rename方法来重命名列名,列名映射通过数据字典进行定义
# 通过数据字典进行列名重命名
colNameDict = {'购药时间':'销售时间'}
# inplace = True 直接改动数据库进行重命名
salesDf.rename(columns=colNameDict,inplace = True)
salesDf.head()
3,缺失数据处理
通过数据框的dropna进行缺失数据删除(入门级删除方案)
# 采用直接删除缺失值方法dropna进行缺失数据处理
# subset 指定删除依据的数据列,how = 'any' 表示任意一列有空值,就删除
print('删除缺失值前的大小为:',salesDf.shape)
salesDf = salesDf.dropna(subset = ['销售时间','社保卡号'],how = 'any')
print('删除缺失值后的大小为:',salesDf.shape)
删除缺失值前的大小为: (6578, 7)
删除缺失值后的大小为: (6575, 7)
4,数据类型转换
首先看一下数据框中每一列的数据类型
salesDf.dtypes
返回结果:
销售时间 object
社保卡号 object
商品编码 object
商品名称 object
销售数量 object
应收金额 object
实收金额 object
dtype: object
销售时间应该转换为时间类型,同时去掉星期几
# 通过字符串split方法定义一个处理列表的字符串拆分函数splitSaletime
def splitSaletime(timeColSer):
timeList = []
for value in timeColSer:
dateStr = value.split(' ')[0]
timeList.append(dateStr)
timeSer = pd.Series(timeList)
return timeSer
# 调用函数splitSaletime 处理销售时间列,去掉星期几
timeSer = salesDf.loc[:,'销售时间']
dateSer = splitSaletime(timeSer)
salesDf.loc[:,'销售时间'] = dateSer
salesDf.head()
返回结果:
销售时间列转换为时间类型
salesDf.loc[:,'销售时间'] = pd.to_datetime(salesDf.loc[:,'销售时间'],
format = '%Y-%m-%d',
errors = 'coerce')
salesDf.dtypes
返回结果
销售时间 datetime64[ns]
社保卡号 object
商品编码 object
商品名称 object
销售数量 object
应收金额 object
实收金额 object
dtype: object
继续处理其他列,销售数量、应收金额、实收金额全部转换为数字类型
# object 转换为float类型
salesDf['销售数量'] = salesDf['销售数量'].astype('float')
salesDf['应收金额'] = salesDf['应收金额'].astype('float')
salesDf['实收金额'] = salesDf['实收金额'].astype('float')
print('转换后的数据类型:\n',salesDf.dtypes)
返回结果:
转换后的数据类型:
销售时间 datetime64[ns]
社保卡号 object
商品编码 object
商品名称 object
销售数量 float64
应收金额 float64
实收金额 float64
dtype: object
5.数据排序
# sort_values按照日期进行排序
# by 指定排序依据,ascending=True 升序
salesDf = salesDf.sort_values(by = '销售时间',ascending=True)
salesDf.head()
返回结果:
重置索引
# reset_index索引重置
salesDf = salesDf.reset_index(drop=True)
salesDf.head()
返回结果
6,获取统计信息
# describe()获取描述统计信息
salesDf.describe()
返回结果:
从结果来看,销售数量、应收金额、实收金额中有小于0的异常值,下一步需要处理异常值
7,异常值处理
#删除异常值
# 构建查询条件
querySer = salesDf.loc[:,'销售数量']>0
print("删除异常值前",salesDf.shape)
#应用查询条件
salesDf = salesDf.loc[querySer,:]
print("删除异常值后",salesDf.shape)
返回结果:
删除异常值前 (6575, 7)
删除异常值后 (6532, 7)
再次查询统计信息
# describe()获取描述统计信息
salesDf.describe()
结果显示销售数量、应收金额、实收金额已无异常值。
综上,就是一个数据清洗步骤的实践过程选择子集
列名重命名
缺失数据处理
数据类型转换
数据排序
异常值处理秦艳超:数据分析基本过程:销售数据分析案例zhuanlan.zhihu.com