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