当前位置:   article > 正文

Python数据分析与应用 |第4章 使用pandas进行数据预处理 (实训)

Python数据分析与应用 |第4章 使用pandas进行数据预处理 (实训)

表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 部分中风患者的年龄和平均血糖数据

编号年龄平均血糖
904667228.69
5167661202.21
3111280105.92
6018249171.23
166579174.12
5666981186.21
538827470.09
104346994.39
274195976.15
604917858.57

实训1 合并年龄、平均血糖和中风患者信息数据

1、训练要点

(1) 掌握判断主键的方法

(2) 掌握主键合并方法

2、需求分析

某医院为了早期监测预警患者的中风风险,对现有中风患者的基础信息和体检数据(healthcare-dataset-stroke.xls)进行分析,观察发现患者基础信息和体检数据中缺少中风患者的年龄和平均血糖的信息。另有年龄和平均血糖数据(healthcare-dataset-age_abs.xls)存放了分析所需的患者的年龄和平均血糖信息。

(1)读取两个数据文件,打印前5行结果进行显示。

  1. # 合并年龄、平均血糖和中风患者数据
  2. import pandas as pd
  3. df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
  4. df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. #(1)读取两个数据文件,打印前5行结果进行显示。
  6. print("healthcare-dataset-stroke.xls前5行:")
  7. print(df1.head(5))
  8. print("----------------------------------------")
  9. print("healthcare-dataset-age_abs.xls前5行:")
  10. print(df2.head(5))

(2)利用concat函数进行纵向堆叠,展示‘内连接‘、‘外连接’的拼接结果(前5行即可)。

  1. # 使用concat函数进行纵向堆叠
  2. import pandas as pd
  3. df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
  4. df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. # 外连接
  6. df_concat = pd.concat([df1, df2], axis=0, join='outer')
  7. print("纵向堆叠结果前5行(外连接):")
  8. print(df_concat.head(5))
  9. # 内连接
  10. df_concat = pd.concat([df1, df2], axis=0, join='inner')
  11. print("纵向堆叠结果前5行(内连接):")
  12. print(df_concat.head(5))

(3)对两个数据利用‘编号’列作为主键进行合并,展示合并结果(前5行即可)

  1. # 使用'编号'列作为主键进行合并
  2. import pandas as pd
  3. df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
  4. df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. df_merge = pd.merge(df1, df2, on='编号', how='inner')
  6. print("合并结果前5行:")
  7. print(df_merge.head(5))

实训2 对表格数据进行数据清洗。

需求说明:

基于1中的数据

(1)对于表格healthcare-dataset-stroke.xls的信息,使用duplicates函数对‘工作类型’、‘吸烟史’两列数据进行特征去重。

  1. # 对于表格healthcare-dataset-stroke.xls的信息,使用duplicates函数对‘工作类型’、‘吸烟史’两列数据进行特征去重
  2. import pandas as pd
  3. # 读取数据
  4. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
  5. # 对'工作类型'和'吸烟史'列进行去重
  6. df = df.drop_duplicates(subset=['工作类型', '吸烟史'])
  7. # 打印结果
  8. print(df)

(2)对于表格healthcare-dataset-age_abs.xls的信息,对‘年龄’、‘平均血糖’两列数据,使用sum及isnull函数判断及统计缺失值。

  1. # 对于表格healthcare-dataset-age_abs.xls的信息,对‘年龄’、‘平均血糖’两列数据,使用sum及isnull函数判断及统计缺失值。
  2. import pandas as pd
  3. # 读取数据
  4. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. # 判断是否有缺失值
  6. missing_values = df.isnull()
  7. # 统计缺失值的个数
  8. missing_count = missing_values.sum()
  9. # 打印结果
  10. print("缺失值统计:")
  11. print(missing_count)

(3)对‘年龄’列的数据使用均值替换其缺失值;对‘平均血糖’列数据使用3阶多项式进行插值。

  1. # (3) 对‘年龄’列的数据使用均值替换其缺失值;对‘平均血糖’列数据使用3阶多项式进行插值。
  2. import pandas as pd
  3. import numpy as np
  4. # 读取数据
  5. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  6. # 计算年龄的均值
  7. mean_age = df['年龄'].mean()
  8. # 使用均值替换年龄列的缺失值
  9. df['年龄'] = df['年龄'].fillna(mean_age)
  10. # 对平均血糖列进行3阶多项式插值
  11. df['平均血糖'] = df['平均血糖'].interpolate(method='polynomial', order=3)
  12. # 打印结果
  13. print(df)

(4)使用3δ原则判断‘年龄’、‘平均血糖’两列数据中是否存在异常值及异常值的个数。

  1. import pandas as pd
  2. import numpy as np
  3. # 读取数据
  4. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. # 计算年龄和平均血糖的均值和标准差
  6. mean_age = df['年龄'].mean()
  7. std_age = df['年龄'].std()
  8. mean_glucose = df['平均血糖'].mean()
  9. std_glucose = df['平均血糖'].std()
  10. # 使用3δ原则判断是否存在异常值
  11. outliers_age = (np.abs(df['年龄'] - mean_age) > 3 * std_age)
  12. outliers_glucose = (np.abs(df['平均血糖'] - mean_glucose) > 3 * std_glucose)
  13. # 统计异常值的个数
  14. num_outliers_age = outliers_age.sum()
  15. num_outliers_glucose = outliers_glucose.sum()
  16. # 打印结果
  17. print("年龄异常值个数:", num_outliers_age)
  18. print("平均血糖异常值个数:", num_outliers_glucose)

实训 3 基于healthcare-dataset-age_abs.xls中的‘平均血糖’列数据,(1)使用离差标准化、标准差标准化、小数定标标准化进行标准化处理。

需求分析:

(1)使用离差标准化 进行标准化处理

  1. import pandas as pd
  2. # 读取数据
  3. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  4. # 离差标准化
  5. df['平均血糖_离差标准化'] = (df['平均血糖'] - df['平均血糖'].min()) / (df['平均血糖'].max() - df['平均血糖'].min())
  6. print(df)

(2)使用标准差标准化进行标准化处理

  1. # 标准差标准化
  2. import pandas as pd
  3. # 读取数据
  4. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  5. df['平均血糖_标准差标准化'] = (df['平均血糖'] - df['平均血糖'].mean()) / df['平均血糖'].std()
  6. print(df)

(3)使用小数定标标准化进行标准化处理。

  1. import pandas as pd
  2. # 读取数据
  3. df = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  4. # 使用0填充缺失值
  5. df['平均血糖'] = df['平均血糖'].fillna(0)
  6. # 小数定标标准化
  7. df['平均血糖_小数定标标准化'] = df['平均血糖'] / (10 ** (df['平均血糖'].apply(lambda x: len(str(abs(int(x))))) - 1))
  8. # 打印结果
  9. print(df)

实训4 对表healthcare-dataset-stroke.xls中‘吸烟史’的类别型数据进行哑变量处理,转换为数值型数据。

需求说明:

      (1)对表healthcare-dataset-stroke.xls中‘吸烟史’的类别型数据进行哑变量处理,转换为数值型数据。

  1. import pandas as pd
  2. # 读取数据
  3. df1 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-stroke.xlsx')
  4. # 哑变量处理
  5. df1_dummies = pd.get_dummies(df1['吸烟史'], prefix='吸烟史')
  6. print(df1_dummies)

(2)对表healthcare-dataset-age_abs.xls中‘年龄’数据使用等宽法、等频法进行离散化,划分为5类区间。

  1. import pandas as pd
  2. df2 = pd.read_excel('C:/Users/DELL/Python/healthcare-dataset-age-abs.xlsx')
  3. # 等宽法离散化
  4. df2['年龄_等宽法'] = pd.cut(df2['年龄'], bins=5, labels=False)
  5. # 等频法离散化
  6. df2['年龄_等频法'] = pd.qcut(df2['年龄'], q=5, labels=False)
  7. print(df2[['年龄', '年龄_等宽法', '年龄_等频法']])

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/474495
推荐阅读
相关标签
  

闽ICP备14008679号