目的:掌握 熟悉 pandas matplotplt numpy等库
1导入数据
- #导入数据
- file_name = '朝阳医院2018年销售数据.xlsx'
- # 使用ExcelFile()时需要传入目标excel文件所在路径及文件名称
- xls = pd.ExcelFile(file_name)
- print(xls)
- # 使用parse()可以根据传入的sheet名称来提取对应的表格信息转化成df格式
- dataDF = xls.parse('Sheet1',dtype='object')
- print(dataDF)
- # 输出前五行数据
- dataDF.head()

其中,商品编码就是商品名称 这两列数据重复
2查看数据
- # 使用sheet_names来查看当前表格中包含的所有sheet名称(按顺序)
- print(xls.sheet_names[0])
- #查看基本信息
- #查看数据几行几列
- print(dataDF.shape)
- #查看索引
- print(dataDF.index)
- #查看每一列的列表头内容
- print(dataDF.columns)
- #查看每一列数据统计数目
- print(dataDF.count())
以下可知购药时间和社保卡号存在缺失值

重命名一些列名
- #列重命名
- dataDF.rename(columns={'购药时间':'销售时间'},inplace=True)
- print(dataDF.head())
处理缺失值
- #缺失值处理
- print('删除缺失值前:', dataDF.shape)
-

删除缺失值
- # 使用info查看数据信息,
- #print(dataDF.info())
- #删除缺失值
- # axis:轴。0或'index',表示按行删除;1或'columns',表示按列删除。
- # how:筛选方式。‘any',表示该行/列只要有一个以上的空值,就删除该行/列;‘all',表示该行/列全部都为空值,就删除该行/列。
- # thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
- # subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index',subset中元素为列的索引;如果axis=1或者‘column',subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
- # inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
- dataDF = dataDF.dropna(subset=['销售时间','社保卡号'], how='any')
- print('\n删除缺失值后',dataDF.shape)

数据类型转换
- #数据类型转换
- dataDF['销售数量'] = dataDF['销售数量'].astype('float')
- dataDF['应收金额'] = dataDF['应收金额'].astype('float')
- dataDF['实收金额'] = dataDF['实收金额'].astype('float')
- print(dataDF.dtypes)
索引重构
- dataDF = dataDF.reset_index(drop=True) # 索引重构
- print(dataDF)


定义函数:分割销售日期,提取销售日期 输入:timeColSer 销售时间这一列,Series数据类型,例‘2018-01-01 星期五’ 输出:分割后的时间,返回Series数据类型,例‘2018-01-01’
- def splitSaletime(timeColSer):
- timeList = []
-
- for value in timeColSer:
- dateStr = value.split(' ')[0] # 用空格进行分割 并取第0项,也就是日期
- timeList.append(dateStr)
-
- timeSer = pd.Series(timeList) # 将列表转行为一维数据Series类型
- return timeSer
-
- #获取“销售时间”这一列
- timeSer = dataDF.loc[:,'销售时间']
- print(timeSer)
- #对字符串进行分割,提取销售日期
- dateSer = splitSaletime(timeSer)
-
- #修改销售时间这一列的值
- dataDF.loc[:,'销售时间'] = dateSer
-
- print(dataDF.head())


数据类型转换:字符串转换为日期 把切割后的日期转为时间格式,方便后面的数据统计:
- #errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaT
- dataDF.loc[:, '销售时间'] = pd.to_datetime(dataDF.loc[:, '销售时间'], format='%Y-%m-%d', errors='coerce')
-
- print(dataDF.dtypes)

统计空值
- print(dataDF.head())
- print(dataDF.isnull().sum())

销售时间转换后有23个null
转换日期过程中不符合日期格式的数值会被转换为空值 删除含有NaT的空行
- dataDF = dataDF.dropna(subset=['销售时间','社保卡号'],how='any')
- datasDF = dataDF.reset_index(drop = True) #索引重铸
数据排序
- #数据排序
- dataDF = dataDF.sort_values(by='销售时间', ascending=True) # 升序排序
- dataDF = dataDF.reset_index(drop=True)
- dataDF.head()
- #查看描述统计信息
- print(dataDF.describe())
将'销售数量'这一列小于0的数据排除掉
- # 将'销售数量'这一列小于0的数据排除掉
- pop = dataDF.loc[:,'销售数量'] > 0
- print(pop)
- dataDF = dataDF.loc[pop, :] # 选取布尔值真的行和所有列
- dataDF.describe()