python实验报告9 数据可视化操作——pandas

我发现很多人都不太清楚这个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 pd
import matplotlib.pyplot as plt
plt.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 pd
import matplotlib.pyplot as plt
plt.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 中每个唯一值的出现次数。在这里,它会统计不同成绩区间的出现次数。

相关推荐
databook8 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar10 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805110 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_10 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机16 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机18 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机18 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i18 小时前
drf初步梳理
python·django
每日AI新事件18 小时前
python的异步函数
python