文章目录
一、数据集
数据集:资料,提取码:hp4i
二、实现
导包和准备工作
# -*- coding: utf-8 -*
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 导入数据集
df = pd.read_excel('testdata.xls')
# 设置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
1、查看数据类型、表结构、统计各字段缺失值个数
print(df.dtypes)
print(df.info())
df.isna().sum()
2、删除所有全为空的列及身份证号为空的数据
# 观察缺失值 发现细胞其它值是空列
del df['细胞其它值']
df.dropna(subset=['身份证号'],inplace=True)
df.isna().sum()
3、将“开始从事某工作年份”规范为4位数字年份,如’2008‘,并将列名修改为’参加工作时间‘
def trans(x):
y=str(x).strip()[0:4]
# 有个很坑的数据 年份是个小数 也要去掉
if float(y)>=1000:
return int(y)
df.rename(columns={'开始从事某工作年份':'参加工作时间'},inplace=True)
df.dropna(subset=['参加工作时间'],inplace=True)
df['参加工作时间']=df['参加工作时间'].apply(lambda x:trans(x))
4、添加列’工龄‘(体检年份-参加工作时间)和’年龄‘(体检时间-出生年份)两列。
df.dropna(subset=['体检年份'],inplace=True)
df.dropna(subset=['身份证号'],inplace=True)
df['体检年份']=df['体检年份'].apply(lambda x:int(str(x)[0:4]))
df['工龄']=df['体检年份']-df['参加工作时间']
df['年龄']=df['体检年份']-df['身份证号'].apply(lambda x:int(str(x)[4:8]))
5、统计不同性别的白细胞计数均值,画出柱状图
df.groupby('性别')['白细胞计数'].mean().plot.bar()
plt.show()
6、统计不同年龄段的白细胞计数,画出柱状图
def accu(x):
if x<=30: return '小于等于30'
elif x>30 and x<=40: return '大于30,小于40'
elif x>40 and x<=50: return '大于40,小于50'
else: return '大于50'
df['年龄段']=df.apply(lambda x:accu(x['年龄']),axis=1)
df.groupby('年龄段')['白细胞计数'].mean().plot.bar()
plt.show()
三、完整代码
# -*- coding: utf-8 -*
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 导入数据集
df = pd.read_excel('testdata.xls')
# 设置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
# A
print(df.dtypes)
print(df.info())
df.isna().sum()
# B
del df['细胞其它值']
df.dropna(subset=['身份证号'],inplace=True)
df.isna().sum()
# c
def trans(x):
y=str(x).strip()[0:4]
if float(y)>=1000:
return int(y)
df.rename(columns={'开始从事某工作年份':'参加工作时间'},inplace=True)
df.dropna(subset=['参加工作时间'],inplace=True)
df['参加工作时间']=df['参加工作时间'].apply(lambda x:trans(x))
# d
df.dropna(subset=['体检年份'],inplace=True)
df.dropna(subset=['身份证号'],inplace=True)
df['体检年份']=df['体检年份'].apply(lambda x:int(str(x)[0:4]))
df['工龄']=df['体检年份']-df['参加工作时间']
df['年龄']=df['体检年份']-df['身份证号'].apply(lambda x:int(str(x)[4:8]))
# e
df.groupby('性别')['白细胞计数'].mean().plot.bar()
plt.show()
# f
def accu(x):
if x<=30: return '小于等于30'
elif x>30 and x<=40: return '大于30,小于40'
elif x>40 and x<=50: return '大于40,小于50'
else: return '大于50'
df['年龄段']=df.apply(lambda x:accu(x['年龄']),axis=1)
df.groupby('年龄段')['白细胞计数'].mean().plot.bar()
plt.show()