Python据框和序列的访问、切片及运算(中国大学综合排名2021.xlsx)

本文介绍了使用Python的Pandas库进行数据处理的实验,包括读取Excel文件、数据类型检查、缺失值处理、统计分析和交叉分析。实验以中国大学2021综合排名数据为例,展示了如何统计排名变化、各省市大学数量、平均分以及学校类型与排名的关系。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、实验要求

二、相关文件

三、使用 Jupyter工具导入项目步骤

 四、实验内容

1.导入模块

2. Pandas数据处理

2.1 读取数据

 2.2 查看表格数据类型

2.3 查看表格数据描述 

2.4 查看表格缺失数据

2.5 填充缺失数据 

2.6 统计所有排名未改变的学校 

2.7 统计前50名中排名下降的学校

2.8 比较综合排名前50的学校的人才培养情况

 2.9 统计各省市大学数量

2.10 各省市大学数量与平均分(按平均分降序排序 )

2.11 学校类型与排名交叉分析

五、总结


一、实验要求

本次实验主要目的如下:

熟悉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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷滴Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值