大数据分析与可视化 之 实验09 Pandas函数应用

发布时间 2023-12-30 20:10:03作者: Ivan丶c

实验09 Pandas函数应用

实验学时:2学时
实验类型:验证
实验要求:必修

一、实验目的

  1. 掌握pandas函数应用的方法:pipe()、apply()和applymap()。
  2. 能编写自定义函数。
  3. 能使用pandas函数应用调用自定义函数解决数据分析实际问题。

二、实验要求

利用pandas函数应用的方法解决数据分析实际问题,能编写自定义函数。

三、实验内容

任务1.使用pandas创建5行3列的1-10之间的随机数数据帧,自定义以下函数,调用这些函数求:

  1. 所有值加2
  2. 各行、各列的平均值,
  3. 对第2列的所有值乘以3,
  4. 求各列最大值与最小值的差。
    用python的Pandas库编程实现。
def cheng(cX):
    return  cX*3
def sub(tempX):
    return  tempX.max()-tempX.min()
def addr(elm1,elm2):
    return  elm1+elm2

任务2. 给定数据文件:mydata.xls,使用pandas函数求出:
(1)每门课程的总分、平均分、最高分、最低分、及格人数、不及格人数;
(2)每位学生的总分;
(3)按总分排出名次;
(4)每门课程的及格率、不及格率及优秀率(90或90分以上)、标准差;
(5)按性别分组,求出平均值。
用python编程实现。

任务3. 给定数据文件:sporter.xlsx,使用pandas函数将统计的运动员基本信息进行归类,筛选出所有篮球运动员的基本信息,以统计篮球运动员的如下几个测试指标:
(1)统计篮球运动员的平均年龄、身高、体重。
(2)统计男篮球运动员的年龄、身高、体重的极差值。
(3)统计篮球运动员的体质指数(BMI值)。
体质指数(BMI)=体重(kg)÷ 身高2
用python编程实现。

test9.py

import pandas as pd
import numpy as np


def cheng(cX):
    return cX * 3


def sub(tempX):
    return tempX.max() - tempX.min()


def addr(elm1, elm2):
    return elm1 + elm2


def task1():
    # 创建一个 5x3 的 DataFrame,其中包含 1 到 10 之间的随机值
    np.random.seed(42)  # 设置种子以便重现结果
    data = np.random.randint(1, 11, size=(5, 3))
    df = pd.DataFrame(data, columns=['列1', '列2', '列3'])

    # 1:在DataFrame中的所有值上加2
    df_added_2 = df.applymap(lambda x: addr(x, 2))

    # 2:计算每行和每列的平均值
    row_means = df.mean(axis=1)
    col_means = df.mean()

    # 3:将第二列的所有值乘以3
    df_col2_multiplied = df.copy()
    df_col2_multiplied['列2'] = cheng(df_col2_multiplied['列2'])

    # 4:计算每列最大值与最小值的差
    col_diff = df.apply(sub)

    # 显示结果
    print("原始DataFrame:")
    print(df)
    print("\n任务1:所有值加2")
    print(df_added_2)
    print("\n任务2:行平均值")
    print(row_means)
    print("\n任务2:列平均值")
    print(col_means)
    print("\n任务3:第二列乘以3")
    print(df_col2_multiplied)
    print("\n任务4:每列最大值与最小值的差")
    print(col_diff)


def task2():
    # 读取 Excel 文件
    df = pd.read_excel('mydata.xlsx', skiprows=3, skipfooter=2)
    # 检查数据列名
    print(df.columns)
    # 为了方便演示,我仅选择部分列进行示例
    selected_columns = ['姓名', '性别', '高等数学', '大学英语', '操作系统', 'Python语言', '计算机组成原理']

    # 检查数据是否包含所需的列
    if set(selected_columns).issubset(df.columns):
        # (1) 每门课程的统计信息
        course_stats = df[selected_columns[2:]].agg(
            ['sum', 'mean', 'max', 'min', lambda x: sum(x >= 60), lambda x: sum(x < 60)])
        course_stats.index = ['总分', '平均分', '最高分', '最低分', '及格人数', '不及格人数']
        # (2) 每位学生的总分
        df['总分'] = df[selected_columns[2:]].sum(axis=1)
        # (3) 按总分排名
        df['总分排名'] = df['总分'].rank(ascending=False, method='min')
        # (4) 每门课程的统计信息(及格率、不及格率、优秀率、标准差)
        course_stats_2 = df[selected_columns[2:]].agg(['mean', lambda x: sum(x >= 60) / len(x),
                                                       lambda x: sum(x < 60) / len(x), lambda x: sum(x >= 90) / len(x),
                                                       'std'])
        course_stats_2.index = ['平均分', '及格率', '不及格率', '优秀率', '标准差']
        # (5) 按性别分组,求平均值
        gender_means = df.groupby('性别')['总分'].mean()
        # 显示结果
        print("(1) 每门课程的统计信息:")
        print(course_stats)
        print("\n(2) 每位学生的总分:")
        print(df[['姓名', '总分']])
        print("\n(3) 按总分排名:")
        print(df[['姓名', '总分', '总分排名']].sort_values(by='总分排名'))
        print("\n(4) 每门课程的统计信息(及格率、不及格率、优秀率、标准差):")
        print(course_stats_2)
        print("\n(5) 按性别分组的平均值:")
        print(gender_means)
    else:
        print("数据缺少所需的列。请检查列名是否正确。")


def task3():
    # 读取 Excel 文件
    df = pd.read_excel('sporter.xlsx')

    # 筛选出篮球运动员
    basketball_players = df[df['项目'] == '篮球'].copy()

    # (1) 统计篮球运动员的平均年龄、身高、体重
    avg_age = basketball_players['年龄(岁)'].mean()
    avg_height = basketball_players['身高(cm)'].mean()
    avg_weight = basketball_players['体重(kg)'].mean()

    # (2) 统计男篮球运动员的年龄、身高、体重的极差值
    male_basketball_players = basketball_players[basketball_players['性别'] == '男']
    range_age = male_basketball_players['年龄(岁)'].max() - male_basketball_players['年龄(岁)'].min()
    range_height = male_basketball_players['身高(cm)'].max() - male_basketball_players['身高(cm)'].min()
    range_weight = male_basketball_players['体重(kg)'].max() - male_basketball_players['体重(kg)'].min()

    # (3) 统计篮球运动员的体质指数(BMI值)
    basketball_players.loc[:, 'BMI'] = basketball_players['体重(kg)'] / (basketball_players['身高(cm)'] / 100) ** 2

    # 显示结果
    print(f"(1) 篮球运动员的平均年龄:{avg_age:.2f} 岁")
    print(f"    篮球运动员的平均身高:{avg_height:.2f} cm")
    print(f"    篮球运动员的平均体重:{avg_weight:.2f} kg")

    print(f"\n(2) 男篮球运动员的年龄极差:{range_age} 岁")
    print(f"    男篮球运动员的身高极差:{range_height} cm")
    print(f"    男篮球运动员的体重极差:{range_weight} kg")

    print("\n(3) 篮球运动员的体质指数(BMI值):")
    print(basketball_players[['姓名', '性别', 'BMI']])


if __name__ == '__main__':
    task1()
    task2()
    task3()