我发现很多人都不太清楚这个csv是怎么弄的,其实通俗的讲就是,你不能用excel形式的改后缀名,你必须通过文本文档去改后缀名,并且必须用或者说默认有题头,行与行之间用换行符,但是数据之间得有逗号(英文版)隔开,不会的话,拿这里我写好的cv到文本文档里面保存改后缀即可,别忘了文件的位置要和你的py文件平齐。

 一、实验内容

1.使用Pandas 打开'StudentInfo.csv'文件,

学号,姓名,平时成绩,期末成绩

1001,张三,80,85

1002,李四,75,78

1003,王五, ,92

1004,赵六,68,70

1005,钱七,95,105

1006,孙八,110,75

1007,李九,78,88

1008,周十,60,62

1009,吴十一,85,-5

1)查看data的统计信息

2)处理空值,将平时成绩和期末成绩中的缺失值填空为0

3)处理重复值,去除学号这列的重复数据,保留重复行中的最后一行

4)处理异常值, 检查期末成绩有没有异常值(<0 或者>100)

5)统计计算出期末成绩的平均计分、最大、最小、以及90分以上的人员个数和具体人员信息

6)按照'60分以下','60-70分','70-80分','80-90分','90-100分'统计成绩分布,并绘图显示。

源代码:

import pandas as pdimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']# 设置显示选项,使输出的每一列对齐pd.set_option('display.unicode.ambiguous_as_wide', True)pd.set_option('display.unicode.east_asian_width', True)# 1. 使用Pandas 打开'StudentInfo.csv'文件file_path = 'StudentInfo.csv'df = pd.read_csv(file_path)# 2. 查看data的统计信息data_statistics = df.describe()print("统计信息:")print(data_statistics)# 3. 处理空值,将平时成绩和期末成绩中的缺失值填充为0,每一列都可以单独拿来用df['平时成绩'].fillna(0, inplace=True)df['期末成绩'].fillna(0, inplace=True)# 4. 处理重复值,去除学号这列的重复数据,保留重复行中的最后一行df.drop_duplicates(subset=['学号'], keep='last', inplace=True)# 5. 处理异常值,检查期末成绩有没有异常值(<0 或者 >100)out_of_range_values = df[(df['期末成绩'] < 0) | (df['期末成绩'] > 100)]if not out_of_range_values.empty:    print("异常值信息:")    print(out_of_range_values)    # 去除异常值,说白了就是保留正确的值    df = df[(df['期末成绩'] >= 0) & (df['期末成绩'] <= 100)]else:    print("没有异常值。")# 6. 统计计算出期末成绩的平均计分、最大、最小、以及90分以上的人员个数和具体人员信息average_score = df['期末成绩'].mean()max_score = df['期末成绩'].max()min_score = df['期末成绩'].min()above_90_count = df[df['期末成绩'] > 90].shape[0]above_90_info = df[df['期末成绩'] > 90]print(f"平均成绩: {average_score}")print(f"最高成绩: {max_score}")print(f"最低成绩: {min_score}")print(f"90分以上的人数: {above_90_count}")print("90分以上的人员信息:")print(above_90_info)# 7. 按照'60分以下','60-70分','70-80分','80-90分','90-100分'统计成绩分布,并绘图显示bins = [0, 60, 70, 80, 90, 100]labels = ['60分以下', '60-70分', '70-80分', '80-90分', '90-100分']df['成绩分布'] = pd.cut(df['期末成绩'], bins=bins, labels=labels, right=False)score_distribution = df['成绩分布'].value_counts()# 绘图score_distribution.plot(kind='bar', color='skyblue')plt.title('成绩分布')plt.xlabel('成绩区间')plt.ylabel('人数')plt.show()

列出测试数据和实验结果截图: 

 

   

2、下图为某公司某部门员工的业绩计分表,数据存储于staff.csv中,该部门负责人需要了解所有人员的平均业绩情况。请按下述要求完成数据处理。

编号,姓名,计分

10011,小张,90

10012,小王,83

10013,小李,89

10014,小赵,91

10015,小云,72

10016,小毛,67

,小方,88

10018,小罗,79

10019,小周,

10020,小雨,90

1)将文件staff.csv中的数据读入,并根据所学知识,选用一种合适的存储结构存储到内存中。

2)选用合适的一种方法,清除表中的不完整数据(含有空值的数据记录均要清除)。

3)统计计算出所有有效人员的平均计分及90分以上的人员数。

4)选用一种合适的图表展示所有有效人员的计分值,显示姓名和计分。

源代码:

import pandas as pdimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']# 1. 读取 CSV 文件并存储到 DataFrame 中file_path = 'staff.csv'data = pd.read_csv(file_path)# 2. 清除表中的不完整数据(含有空值的数据记录均要清除)data.dropna(inplace=True)# 3. 统计计算出所有有效人员的平均计分及90分以上的人员数average_score = data['计分'].mean()above_90 = data[data['计分'] >= 90]['姓名'].count()print(f"所有有效人员的平均计分为: {average_score}")print(f"90分以上的人员数为: {above_90}")# 4. 使用合适的图表展示所有有效人员的计分值,显示姓名和计分plt.figure(figsize=(10, 6))plt.bar(data['姓名'], data['计分'])plt.xlabel('姓名')plt.ylabel('计分')plt.title('员工业绩')plt.xticks(rotation=45)plt.tight_layout()plt.show()

列出测试数据和实验结果截图:

  

 

二、实验总结

1.在Pandas中,pd 是一个常用的惯例别名,用于引入 Pandas 库。一般情况下,我们使用 pd 来代表 Pandas 的命名空间,使得代码更加简洁和易读。

2.然而创建的数据框(DataFrame)通常会使用 df 作为别名,这同样是一个常见的惯例,有助于提高代码的可读性。

3.out_of_range_values = df[(df['期末成绩'] < 0) | (df['期末成绩'] > 100)]

这一行创建了一个新的DataFrame out_of_range_values,其中包含了原始DataFrame df 中期末成绩列中小于0或大于100的所有行。这样,out_of_range_values 就包含了所有异常值的行。

4.接下来的代码块使用条件语句,检查 out_of_range_values 是否为空。如果 out_of_range_values 不为空,说明存在异常值,会执行相关处理。如果为空,说明没有异常值,将执行相应的“没有异常值”的逻辑。

5.Pandas 的 describe() 函数用于生成有关DataFrame各列的统计信息。生成的统计信息包括计数、平均值、标准差、最小值、25% 分位数、中位数(50% 分位数)、75% 分位数和最大值。这对于了解数据的分布和范围非常有帮助。

6.输出的信息中确实没有姓名列。这是因为 describe() 函数默认只处理数值型的列,而忽略了非数值型的列,比如文本列(姓名列通常是字符串类型)。对于数值型列,统计信息是有意义的,但对于非数值型列,这些统计信息则不太适用。

7.# 设置显示选项,使输出的每一列对齐pd.set_option('display.unicode.ambiguous_as_wide', True)pd.set_option('display.unicode.east_asian_width', True)

8.解释第七总结:

pd.set_option('display.unicode.ambiguous_as_wide', True):

这个选项指定了对于 Unicode 字符中的模棱两可字符(ambiguous characters),是否被视为宽字符。在这里,将其设置为 True 表示将这些字符视为宽字符。东亚字符通常被视为宽字符,而非东亚字符被视为窄字符。这有助于确保不同字符宽度的对齐。

pd.set_option('display.unicode.east_asian_width', True):

这个选项指定了是否考虑 Unicode 字符的东亚宽度。将其设置为 True 表示考虑东亚宽度。

9.above_90_count = df[df['期末成绩'] > 90].shape[0]

.shape[0]:shape 是一个元组,包含DataFrame的行数和列数。索引 [0] 表示行。

所以 df[df['期末成绩'] > 90].shape[0] 返回的是期末成绩大于90的学生的数量。如果是1的话就是列。

10.f['成绩分布'] = pd.cut(df['期末成绩'], bins=bins, labels=labels, right=False)

df['期末成绩']: 这部分是从数据框 df 中选择 '期末成绩' 这一列。

pd.cut(...): 这是 Pandas 提供的一个用于划分数据的函数。它可以将一列连续的数值数据划分为离散的区间。

bins=bins: 这是指定划分的区间边界。

labels=labels: 这是指定每个区间的标签。

right=False: 这表示在划分区间时,左闭右开,默认是左开右闭。

11..value_counts(): 这是一个 Pandas Series 对象的方法,用于计算该 Series 中每个唯一值的出现次数。在这里,它会统计不同成绩区间的出现次数。

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: