不同选课人数范围内的公共基础课和专业课程的课程数统计

不同选课人数范围内的公共基础课和专业课程的课程数统计

需求分析

1.有两张表格,首先先合并表格,然后使用姓名作为连接键,保留一对多的情况
2.筛选出所需的课程类型,根据课程类型(KCLBMC)和选课人数进行分组和统计

代码

    def get_course_type_number(self):
        # 读取第一张表格
        table1 = pd.read_excel("校外老师.xlsx")

        # 读取第二张表格
        table2 = pd.read_excel("课表信息.xlsx")

        # 合并两张表格,使用姓名作为连接键,保留一对多的情况
        merged_table = pd.merge(table1, table2, on='姓名', how='left')

        # 筛选出所需的课程类型
        allowed_kclbmc = ['公共基础课', '专业方向课', '专业核心课', '专业基础课', '专业课', '专业选修课']
        filtered_table = merged_table[merged_table['KCLBMC'].isin(allowed_kclbmc)]

        # 根据课程类型(KCLBMC)和选课人数进行分组和统计
        course_counts = filtered_table.groupby(
            ['KCLBMC', pd.cut(filtered_table['选课人数'], [0, 30, 50, 100, 150, 200, float('inf')])]).size().unstack(
            fill_value=0)

        # 重新命名列,以便更清晰地表示选课人数范围
        course_counts.columns = ['30人以下', '31-50人', '51-100人', '101-150', '151-200', '201人以上']

        # 输出结果
        print("不同选课人数范围内的公共基础课和专业课程的课程数统计:")
        print(course_counts)

重要知识点补充

"merge" 通常用于合并两个或多个数据框(DataFrame)的操作,特别是当它们有一个或多个公共列时。这个操作类似于 SQL 中的 JOIN 操作。
在 pandas 中,你可以使用 merge() 方法来执行数据框的合并操作。该方法有很多参数,允许你指定如何合并以及要合并的数据框。通常,你需要指定以下参数:
left 和 right:要合并的两个数据框。
how:合并方式,如 "inner"(内连接,只保留两个数据框中都有的行)、"outer"(外连接,保留所有行,缺失的部分填充 NaN)、"left"(左连接,只保留左边数据框
的所有行)、"right"(右连接,只保留右边数据框的所有行)等。
on:指定用于合并的列名,通常是公共列。
其他参数:你还可以使用其他参数来指定更多的合并选项,如 suffixes 用于处理列名冲突。

DataFrame['列名'].isin(values) 用于过滤和选择数据框中的行,以检查某一列中的元素是否包含在指定的值列表中。通常,isin 方法用于筛选符合特定条件的行。
ataFrame:你要筛选的数据框。
'列名':你要在哪一列中进行筛选。
values:一个列表,包含你要检查是否存在于该列中的值。
isin 方法返回一个布尔 Series,该 Series 的每个元素都指示原始列中的对应元素是否在指定的值列表中。
在代码中使用该方法,只有符合条件的行被选中,因此filtered_table里面包含了要求的列

filtered_table.groupby(
            ['KCLBMC', pd.cut(filtered_table['选课人数'], [0, 30, 50, 100, 150, 200, float('inf')])]).size().unstack(
            fill_value=0):
groupby 方法用于对数据进行分组。你传递了两个参数给 groupby:
['KCLBMC']:你希望根据 'KCLBMC' 列的值进行分组。
pd.cut(filtered_table['选课人数'], [0, 30, 50, 100, 150, 200, float('inf')]):你希望将 '选课人数' 列的值分成若干范围,这个操作使用了 
pd.cut 方法。它将 '选课人数' 列中的值划分为 [0, 30], (30, 50], (50, 100], (100, 150], (150, 200],(200, 正无穷大) 这六个范围。这将导致
你的数据被分为这些范围内的组。
size() 方法用于计算每个分组的大小,也就是每个组中有多少行。
unstack(fill_value=0) 用于将分组结果从多层索引格式转换为表格格式。fill_value=0 表示如果某些组没有数据,将其填充为 0。
这段代码的目的是生成一个表格,其中行表示不同的 'KCLBMC' 值,列表示 '选课人数' 范围,每个单元格中包含相应组的大小。这种格式便于对数据进行可视化或进一步
分析。
groupby:可以接受一个或多个参数,以便更灵活地定义分组规则。当你向 groupby 传递多个参数时,它将根据这些参数的组合创建多层次分组(多重索引)。这可以用来实
现更复杂的分组方式,以满足特定的分析需求。
当你传递多个参数给 groupby 时,它会按照参数的顺序创建多级索引,数据框中的数据将根据这些参数的组合进行分组。这允许你在同一操作中按多个条件对数据进行分
组。

pd.cut 是 pandas 中用于将连续数据分成离散区间(bins)的函数。它通常用于将数值型数据划分为不同的分组或区间,便于进一步的分析和可视化。
主要用法如下:
python
Copy code
pd.cut(x, bins, labels=None, right=True, include_lowest=False, duplicates='raise')
x: 要划分的数据,通常是一个 Series。
bins: 定义分组的边界,可以是一个整数,表示分成多少个等宽区间,也可以是一个列表或数组,表示自定义的区间边界。
labels(可选):为每个区间指定标签。如果不提供标签,结果将是分组的编号。
right(可选):指示区间是否包括右边界。
include_lowest(可选):如果为 True,第一个区间包括左边界;如果为 False,第一个区间不包括左边界。
duplicates(可选):如果指定了重复的区间边界,可以设置如何处理。'raise'(默认)表示引发异常,'drop' 表示删除重复的边界,'raise' 表示保留重复的边
界。
pd.cut 返回一个新的 Series,其中包含每个元素所属的区间标签。这允许你将连续型数据变为离散型,以便进行分组、汇总和可视化等分析操作。 相当于表格内某一行信
息都返回了一个标记labels,这个标记可以作为分组的用途。
以下是一个示例:
python
Copy code
import pandas as pd
data = [5, 15, 25, 35, 45, 55, 65, 75]
bins = [0, 20, 40, 60, 80]
labels = ['Low', 'Mid', 'High', 'Very High']
result = pd.cut(data, bins, labels=labels)
在这个示例中,result 将包含每个数据点所属的区间标签,例如,5 属于 'Low'35 属于 'Mid'。这可以帮助你对数据进行分段分析。

你可能感兴趣的:(python,excel)