数据大清洗_Pandas库进阶(综合案例-医院数据统计)

一、项目介绍

近些年来,随着人民生活的提升,人民群众对于医疗条件的选择尤为重视,为此,各个诊所、医院应运而生来保障人民的身体健康。
以下为某医院售药部分的售药记录情况,请根据该医院的售药记录数据,进行相关数据
处理,并提出问题,挖掘其中有价值的信息,为该医院的下一步营销进行指导。

在这里插入图片描述

先进行数据清洗:
(1)把列索引变为容易理解的索引值

(2)删掉有空值的数据

(3)将’销售数量’,‘应收金额’,'实收金额’数据类型转换为 int

(4)删除’销售数量’,‘应收金额’,'实收金额’中小于 0 的数据

(5)'成交时间’特征转标准时间格式:

再进行分析:
(1) 每个月的人流量?
(2)人均平均消费?
(3)使用最频繁的前十种药品?
(4)多少人办社保卡?

二、代码

import pandas as pd

# 加载数据
data = pd.read_excel('./某医院2018年数据.xlsx')
print('data:\n', data)
print('data的列索引:\n', data.columns)
# print('每一列的非空数据的数量:\n', data.count())
print('每一列含有缺失值的数量:\n', pd.isnull(data).sum())

# 先进行数据处理
# 先进行数据清洗:
# (1)把列索引变为容易理解的索引值
# 将  购药时间 ----> 成交时间
# 更改列索引
data.rename(columns={'购药时间': '成交时间'}, inplace=True)
print('更改后的列索引:\n', data.columns)

# (2)删掉有空值的数据
# 删掉所有有空值的数据---->删除掉有空值的行
data.dropna(axis=0, how='any', inplace=True)
print('删除缺失值之后的结果为:\n', data.shape)

# (3)将'销售数量', '应收金额', '实收金额'数据类型转换为 int
# 获取原来的每一列的数据类型
print('原来的数据元素的类型:\n', data.dtypes)
# 修改类型 ---astype
data.loc[:, ['销售数量', '应收金额', '实收金额']] = data.loc[:, ['销售数量', '应收金额', '实收金额']].astype('int')
print('修改数据的元素类型之后的结果为:\n', data.dtypes)

# (4)删除'销售数量', '应收金额', '实收金额'中小于 0 的数据
# 根据具体业务剔除 异常值 ---自己设置函数
# 删除掉 '销售数量', '应收金额', '实收金额' < 0 的数据
# --->保留法---销售数量 >0 , 应收金额>0 ,实收金额 >0
#  利用bool数组
bool_mask_1 = data.loc[:, '销售数量'] > 0
bool_mask_2 = data.loc[:, '应收金额'] > 0
bool_mask_3 = data.loc[:, '实收金额'] > 0

# 需要同时满足这三个条件
bool_mask = bool_mask_1 & bool_mask_2 & bool_mask_3

# 筛选出 完全满足条件的
data = data.loc[bool_mask, :]

print("删除'销售数量', '应收金额', '实收金额'中小于 0 的数据之后的结果:\n ", data.shape)


# (5)'成交时间'特征转标准时间格式
def get_time(val):
    """
    获取时间
    :param val: 原时间字符串
    :return: 处理之后的时间
    """
    val = val.split(' ')[0]
    if val == '2018-02-29':
        val = '2018-02-28'
    # 转化为pandas支持时间格式
    val = pd.to_datetime(val)

    return val


data.loc[:, '成交时间'] = data.loc[:, '成交时间'].transform(get_time)
print('修改时间数据之后的结果:\n', data)
print('修改时间数据之后的结果:\n', data.dtypes)
print('*' * 100)

# 分析:
# (1)每个月的人流量?
# 每个月的人流量
# 统计每个月的 人的数量
# 获取 月属性---列表推导式
# data.loc[:, 'month'] = [tmp.month for tmp in data.loc[:, '成交时间']]
data.loc[:, 'month'] = data.loc[:, '成交时间'].dt.month  # 和列表推导式达到结果是一样
print('data:\n', data)
print('*' * 100)


# 每个社保账号对应一个人, 每一个具体的成交时间 对应一个人
# 同一个社保卡号,在不同的时间 ----算不同流量
# 需要对 社保账号、成交时间进行去重
res = data.loc[:, ['month', '成交时间', '社保卡号']].drop_duplicates(subset=['社保卡号', '成交时间'], inplace=False)
# 按照 月进行分组,统计行数
res_liuliang = res.groupby(by='month')['社保卡号'].count()
print('每个月的人流量:\n', res_liuliang)


# (2)人均平均消费?
# 计算人数
# 可以对社保卡号进行去重 ---计算不同的社保号 的消费 --人均消费
counts = data.drop_duplicates(subset='社保卡号', inplace=False).shape[0]
# 计算总的销售额
all_shouru = data.loc[:, '实收金额'].sum()

print('人均消费金额为:', all_shouru / counts)


# (3)使用最频繁的前十种药品?
# 按照 商品名称进行分组---统计各个组内 销售数量的 sum
res = data.groupby(by='商品名称')['销售数量'].sum().reset_index().sort_values(by='销售数量',ascending=False).head(10)
print('使用最频繁的前十种药品:\n',res)


# (4)多少人办社保卡?
# 人数 ---?出现多少次社保账号--->就有多少人
# counts = data.drop_duplicates(subset='社保卡号', inplace=False).shape[0]
print('拥有社保卡号的人数为:\n',counts)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值