表1-1healthcare-dataset-stroke.xlsx 部分中风患者的基础信息和体检数据
|-------|----|-----|------|------|------|------|------|----|
| 编号 | 性别 | 高血压 | 是否结婚 | 工作类型 | 居住类型 | 体重指数 | 吸烟史 | 中风 |
| 9046 | 男 | 否 | 是 | 私人 | 城市 | 36.6 | 以前吸烟 | 是 |
| 51676 | 女 | 否 | 是 | 私营企业 | 农村 | N/A | 从不吸烟 | 是 |
| 31112 | 男 | 否 | 是 | 私人 | 农村 | 32.5 | 从不吸烟 | 是 |
| 60182 | 女 | 否 | 是 | 私人 | 城市 | 34.4 | 抽烟 | 是 |
| 1665 | 女 | 是 | 是 | 私营企业 | 农村 | 24 | 从不吸烟 | 是 |
| 56669 | 男 | 否 | 是 | 私人 | 城市 | 29 | 以前吸烟 | 是 |
| 53882 | 男 | 是 | 是 | 私人 | 农村 | 27.4 | 从不吸烟 | 是 |
表二 healthcare-dataset-age-abs.xlsx 部分中风患者的年龄和平均血糖数据
|-------|----|--------|
| 编号 | 年龄 | 平均血糖 |
| 9046 | 67 | 228.69 |
| 51676 | 61 | 202.21 |
| 31112 | 80 | 105.92 |
| 60182 | 49 | 171.23 |
| 1665 | 79 | 174.12 |
| 56669 | 81 | 186.21 |
| 53882 | 74 | 70.09 |
| 10434 | 69 | 94.39 |
| 27419 | 59 | 76.15 |
| 60491 | 78 | 58.57 |
实训1 合并年龄、平均血糖和中风患者信息数据
1、训练要点
(1) 掌握判断主键的方法
(2) 掌握主键合并方法
2、需求分析
某医院为了早期监测预警患者的中风风险,对现有中风患者的基础信息和体检数据(healthcare-dataset-stroke.xls)进行分析,观察发现患者基础信息和体检数据中缺少中风患者的年龄和平均血糖的信息。另有年龄和平均血糖数据(healthcare-dataset-age_abs.xls)存放了分析所需的患者的年龄和平均血糖信息。
(1)读取两个数据文件,打印前5行结果进行显示。
python
# 合并年龄、平均血糖和中风患者数据
import pandas as pd
df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
#(1)读取两个数据文件,打印前5行结果进行显示。
print("healthcare-dataset-stroke.xls前5行:")
print(df1.head(5))
print("----------------------------------------")
print("healthcare-dataset-age_abs.xls前5行:")
print(df2.head(5))
(2)利用concat函数进行纵向堆叠,展示'内连接'、'外连接'的拼接结果(前5行即可)。
python
# 使用concat函数进行纵向堆叠
import pandas as pd
df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 外连接
df_concat = pd.concat([df1, df2], axis=0, join='outer')
print("纵向堆叠结果前5行(外连接):")
print(df_concat.head(5))
# 内连接
df_concat = pd.concat([df1, df2], axis=0, join='inner')
print("纵向堆叠结果前5行(内连接):")
print(df_concat.head(5))
(3)对两个数据利用'编号'列作为主键进行合并,展示合并结果(前5行即可)
python
# 使用'编号'列作为主键进行合并
import pandas as pd
df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
df_merge = pd.merge(df1, df2, on='编号', how='inner')
print("合并结果前5行:")
print(df_merge.head(5))
实训2 对表格数据进行数据清洗。
需求说明:
基于1中的数据
(1)对于表格healthcare-dataset-stroke.xls的信息,使用duplicates函数对'工作类型'、'吸烟史'两列数据进行特征去重。
python
# 对于表格healthcare-dataset-stroke.xls的信息,使用duplicates函数对'工作类型'、'吸烟史'两列数据进行特征去重
import pandas as pd
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
# 对'工作类型'和'吸烟史'列进行去重
df = df.drop_duplicates(subset=['工作类型', '吸烟史'])
# 打印结果
print(df)
(2)对于表格healthcare-dataset-age_abs.xls的信息,对'年龄'、'平均血糖'两列数据,使用sum及isnull函数判断及统计缺失值。
python
# 对于表格healthcare-dataset-age_abs.xls的信息,对'年龄'、'平均血糖'两列数据,使用sum及isnull函数判断及统计缺失值。
import pandas as pd
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 判断是否有缺失值
missing_values = df.isnull()
# 统计缺失值的个数
missing_count = missing_values.sum()
# 打印结果
print("缺失值统计:")
print(missing_count)
(3)对'年龄'列的数据使用均值替换其缺失值;对'平均血糖'列数据使用3阶多项式进行插值。
python
# (3) 对'年龄'列的数据使用均值替换其缺失值;对'平均血糖'列数据使用3阶多项式进行插值。
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 计算年龄的均值
mean_age = df['年龄'].mean()
# 使用均值替换年龄列的缺失值
df['年龄'] = df['年龄'].fillna(mean_age)
# 对平均血糖列进行3阶多项式插值
df['平均血糖'] = df['平均血糖'].interpolate(method='polynomial', order=3)
# 打印结果
print(df)
(4)使用3δ 原则判断'年龄'、'平均血糖'两列数据中是否存在异常值及异常值的个数。
python
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 计算年龄和平均血糖的均值和标准差
mean_age = df['年龄'].mean()
std_age = df['年龄'].std()
mean_glucose = df['平均血糖'].mean()
std_glucose = df['平均血糖'].std()
# 使用3δ原则判断是否存在异常值
outliers_age = (np.abs(df['年龄'] - mean_age) > 3 * std_age)
outliers_glucose = (np.abs(df['平均血糖'] - mean_glucose) > 3 * std_glucose)
# 统计异常值的个数
num_outliers_age = outliers_age.sum()
num_outliers_glucose = outliers_glucose.sum()
# 打印结果
print("年龄异常值个数:", num_outliers_age)
print("平均血糖异常值个数:", num_outliers_glucose)
实训 3 基于healthcare-dataset-age_abs.xls中的'平均血糖'列数据,(1)使用离差标准化、标准差标准化、小数定标标准化进行标准化处理。
需求分析:
(1)使用离差标准化 进行标准化处理
python
import pandas as pd
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 离差标准化
df['平均血糖_离差标准化'] = (df['平均血糖'] - df['平均血糖'].min()) / (df['平均血糖'].max() - df['平均血糖'].min())
print(df)
(2)使用标准差标准化进行标准化处理
python
# 标准差标准化
import pandas as pd
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
df['平均血糖_标准差标准化'] = (df['平均血糖'] - df['平均血糖'].mean()) / df['平均血糖'].std()
print(df)
(3)使用小数定标标准化进行标准化处理。
python
import pandas as pd
# 读取数据
df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 使用0填充缺失值
df['平均血糖'] = df['平均血糖'].fillna(0)
# 小数定标标准化
df['平均血糖_小数定标标准化'] = df['平均血糖'] / (10 ** (df['平均血糖'].apply(lambda x: len(str(abs(int(x))))) - 1))
# 打印结果
print(df)
实训4 对表healthcare-dataset-stroke.xls中'吸烟史'的类别型数据进行哑变量处理,转换为数值型数据。
需求说明:
(1)对表healthcare-dataset-stroke.xls中'吸烟史'的类别型数据进行哑变量处理,转换为数值型数据。
python
import pandas as pd
# 读取数据
df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
# 哑变量处理
df1_dummies = pd.get_dummies(df1['吸烟史'], prefix='吸烟史')
print(df1_dummies)
(2)对表healthcare-dataset-age_abs.xls中'年龄'数据使用等宽法、等频法进行离散化,划分为5类区间。
python
import pandas as pd
df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
# 等宽法离散化
df2['年龄_等宽法'] = pd.cut(df2['年龄'], bins=5, labels=False)
# 等频法离散化
df2['年龄_等频法'] = pd.qcut(df2['年龄'], q=5, labels=False)
print(df2[['年龄', '年龄_等宽法', '年龄_等频法']])