提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
一、实验要求
本次实验主要目的如下:
熟悉Python编程,基础结构流程;
数据框和序列的访问、切片及运算;
pandas导入外部数据文件;
本次实验使用的数据集为:中国大学综合排名2021.xlsx
二、相关文件
链接:https://pan.baidu.com/s/10tLASO3rs5VIeXWIoDIeYQ
提取码:kkdq
三、使用 Jupyter工具导入项目步骤
1.菜单栏中找到Anaconda Prompt (Anaconda3),点击运行
2.输入: cd 指定项目的文件夹路径
3.启动项目: Jupyter Notebook
4.复制倒数第二个链接到网页访问。
四、实验内容
注:以下实验内容,如果是使用Jupyter工具编写,一定要从第一个开始运行到下一个,避免出现未定的的变量;如果使用其它的python编译器,一定要补充相应的模块和数据的定义。
1.导入模块
import pandas as pd
import numpy as np
2. Pandas数据处理
2.1 读取数据
# df = pd.read_csv('data/中国大学综合排名.csv')
# df.to_csv("test.csv",encoding='utf-8-sig')
df=pd.read_excel("data/中国大学综合排名2021.xlsx")
df.head(5)
2.2 查看表格数据类型
print(df.dtypes)
print(df.dtypes.index)
print(df.dtypes.values)
2.3 查看表格数据描述
df.describe()
可以看到数据一共有582条,升/降数据只有538条,办学层次、学科水平。。。等只有100条,存在数据缺失。
2.4 查看表格缺失数据
df.isnull().sum()
2.5 填充缺失数据
填充某一列的缺失数据
#填充升/降数据,以填充0为例:
df['升/降'].fillna(0, inplace=True)
df.isnull().sum()
一次性填充所有缺失数据
df.fillna(0, inplace=True)
df.isnull().sum()
可以看到所有列数据均有582条,填充完成。
2.6 统计所有排名未改变的学校
df[df['升/降']==0]
思考:如何统计排名未改变的学校的数量?
df[df['升/降']==0]['学校名称'].count()
# 另一种方式
(df['升/降']==0).sum()
2.7 统计前50名中排名下降的学校
df[(df['排名']<50) & (df['升/降']<0)]
# df.loc[(df['排名']<50) & (df['升/降']<0),:]
从以上的数据中可以发现,前10名的学校排名是没有变化的,这说明实力强的学校排名是很稳定的
(排名列中没有出现10以内的)
2.8 比较综合排名前50的学校的人才培养情况
- 如何筛选出综合排名前50的学校?
- 如何去掉不必要的信息?
- 如何统计综合排名与人才培养排名的差异?
df2=df.copy()
df2['人才培养排名']=df2['人才培养'].rank(method='min',ascending=False).astype(int)
df3=df2[['排名','学校名称', '省市', '类型','人才培养排名']].head(50) # 因为排名已经是排过序的
#df3=df2.loc[:50,['排名','学校名称', '省市', '类型','人才培养排名']]
df3
如何找出差异较大的学校??
差异是指学校的排名与人才培养排名之间的差异
df3[np.abs(df3['排名']-df3['人才培养排名'])>10]
知识点补充:直接赋值与.copy()的区别
a = ['狂飙', '流浪地球', '长津湖', '楚门的世界', '2001太空漫游']
b = a # 直接赋值
c = a.copy() # 复制列表中的所有元素
print('a:', a)
print('b:', b)
print('c:', c, '\n')
del c[1] # 删除列表中的第2个元素
print('a:', a)
print('b:', b)
print('c:', c, '\n')
b.remove('楚门的世界') # 移除指定元素
print('a:', a)
print('b:', b)
print('c:', c, '\n')
c.append('舌尖上的中国') # 添加指定元素
print('a:', a)
print('b:', b)
print('c:', c)
2.9 统计各省市大学数量
- 各省市大学数量又如何获取?
- 筛选后的数据是什么类型?
# 两种统计方法:(方法一)
print(df['省市'].value_counts())
df.groupby('省市').count()["学校名称"]
方法二:
# 各省份大学数量
df_counts = df.groupby('省市').count()['学校名称']
#df_counts = df['省市'].value_counts()
df0 = df_counts.copy()
# 进行降序排列 并在当前df0上进行修改
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html
df0.sort_values(ascending=False, inplace=True)
df0
2.10 各省市大学数量与平均分(按平均分降序排序 )
# concat 默认不做列或者索引合并,单纯叠加
# 合并上面的大学数量跟平均分
df_counts = df.groupby('省市').count()['学校名称']
# 统计每个省份大学的数量以及平均分
# 算出平均分
df_means0 = df.groupby('省市')['总分'].mean()
# 取两位小数
df_means = df_means0.round(2)
df1 = pd.concat([df_counts, df_means], axis=1)
#print(df1)
# join 默认是根据index 来做合并的,index值相同的保留(默认行为 inner)
df1 = df_counts.to_frame().join(df_means)
print(df1)
# 改变列名
df1.columns = ['数量', '平均分']
# 通过 平均分 进行降序排列 并在当前df1上进行修改
df1.sort_values('平均分', ascending=False, inplace=True)
print(df1)
如何更直观反应出平均分与数量之间排名的关系?
df1['数量排名']=df1['数量'].rank(method='min',ascending=False)
df1
2.11 学校类型与排名交叉分析
交叉分析
交叉分析通常用于分析两个或两个以上分组变量之间的关系,以交叉表形式进行变量间关系的对比分析;
从数据的不同维度,综合进行分组细分,进一步了解数据的构成、分布特征。交叉分析有数据透视表
和交叉表两种:
在交叉分析前,先用cut()
函数确定排名变量交叉分析中的分层,然后再利用pivot_table()
函数实现交叉分析。
透视表 pd.pivot_table(data,values,index,columns,agg,func,fill_value,margins)
data
:要应用透视表的数据框。values
:待聚合的列名,默认聚合所有数值列。index
:用于分组的列名或其他分组键,出现在结果透视表的行。columns
:用于分组的列名或其他分组键,出现在结果透视表的列。aggfunc
:聚合函数或函数列表,默认为'mean',可以是任何对groupby有效的函数。fill_value
:用于替换结果表中的缺失值。margins
:添加行/列小计和总计,默认为False。
pivot_table()
函数返回值是数据透视表的结果,该函数相当于Excel中的数据透视表功能。
对排名
和类型
列进行交叉分析,求解不同类型学校
的排名情况
统计。
在交叉分析前,先用cut()
函数确定交叉分析中的分层,然后再利用pivot_table()
函数实现交叉分析。
pd.cut(data,bins,right=true,labels=None,include_lowest=False)
- data: 进行划分的一维数组
- bins:取整数值,表示将x划分为多少个等距的区间。取序列值,表示将x划分在指定序列中
- right:分组时区间选择是[a,b) 还是(a,b],默认为True,即(a,b] 这种右边为闭区间形式
- labels:分组时是否用自定义标签来代替返回的bins,可选项,默认为NULL。
- include_lowest:分组时是否包含左端点,默认为False(不包含)
# 对排名进行分层
# 对排名进行分层
rank_bins = [1, 21, 51, 101, 201, 583]
rank_labels = ["前20名", "21-50名", "51-100名", "101-200名", "201-582名"]
df["排名分层"] = pd.cut(df['排名'], rank_bins, right=False, labels=rank_labels)
df.head(5)
# 创建透视表
# 创建透视表, 参数中 columns, index 即 Dataframe 中的columns index
result1 = pd.pivot_table(
df,
values=["排名"],
index=["排名分层"],
columns=["类型"],
aggfunc=[np.size],
margins=True,
fill_value="无",
)
result1
如何对各省的学校排名情况进行统计??
# 创建透视表
result2 = pd.pivot_table(
df,
values=["排名"],
index=["排名分层"],
columns=["省市"],
aggfunc=[np.size],
margins=True,
# fill_value="无",
)
result2
# print(type(result2))
# print(result2.index)
# print(result2.columns)
# print(result2[('size', '排名', '上海')])
#result2
五、总结
提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了熟悉Python编程,基础结构流程数据框和序列的访问、切片及运算;pandas导入外部数据文件;本次实验使用的数据集为:中国大学综合排名2021.xlsx