目录
Series
DataFrame
DataFrame常用的方法
loc:可以通过行索引查看一行数据
读取文件(.csv)的方法
删除一行或者一列的数据
查看dataframe参数
布尔索引筛选数据
groupby 和 count
reset_index() :重置索引
rename() :修改列的索引名称
sort_values('列名') 根据列中值的大小,从小到大排序
截取前n行数据 :切片
关联操作join()
drop() 删除一列的数据
排名rank()
pandas提供了使我们能够快速便捷地处理大量结构化数据, pandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库灵活的数据处理功能
Series
Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,既然有索引就可以通过索引查找对应的值
如果我们只传入了值,会自动生从0开始的索引
也可以通过手动传入索引
numpy中的大部分函数也是可以使用的,比如最大值max()和平均数mean()
DataFrame
DataFrame 是一个表格型的数据结构,它含有多个列。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(一个列的数据共同用一个列索引)。
为什么说是由Series组成的字典呢?
我们单独取出一个列的数据看看,他的类型果然是Series
取出2个列的数据看看类型,果然开始变成DataFrame了,所以他们的差别就是数据是不是只有一列
所以我们可以通过Series构建DataFrame
DataFrame常用的方法
loc:可以通过行索引查看一行数据
还是使用上面的df1对象
读取文件(.csv)的方法
csv文件是用逗号作为分隔符的文件
格式read_csv(文件路径)
但是这样是有问题的,他把我们的第一行数据当成了列的索引,所以我们需要重新给他传一个索引
在上面的基础上,加上 : 用names=[传入的索引内容...]
head()显示前5行数据,tail()显示后5条数据
(head()里面也可以传入int类型数值,但是最多就显示20条)
删除一行或者一列的数据
#如果是删除一列元素要指定axis是1
stu.drop('name',axis = 1,inplace = True)
#删除行数据,传入行的的索引范围
stu.drop([0,1],inplace = True)
#删除行数据,可以自由选择行数
stu.drop(index = [1,3,5],inplace = True)
查看dataframe参数
info:显所有数据的类型
corr():查看列之间相关程度(首先得是数值类型)
describe():查看列值的在统计方面的部分参考值
布尔索引筛选数据
类似numpy,我们也可以使用布尔索引来筛选数据
groupby 和 count
求每个班级的人数,首先可以直接使用gruop by 分组,取出任意一列元素进行count
没有出现粗字体说明这是Series类型,我们可以给他重新设置一个索引,释放clazz列
reset_index() :重置索引
rename() :修改列的索引名称
格式:rename(columns={"原来的列名:新的列名"})
但是这个修改并不会对数据本身进行修改,我们还需要设置inplace=True,让我们做出的改动作用在这个数据本身
sort_values('列名') 根据列中值的大小,从小到大排序
如果想要从大到小排序,在上面的基础上再设置: ascending=False
截取前n行数据 :切片
可以通过切片实现截取数据
关联操作join()
现在我再次读取一张score表,给列加上索引, 不要让他我们的第一行数据当成索引
上面的数据里面还包含了每一科目的成绩,太多了,我们把总分算出来方便后面关联,再把score列的索引改变一下变成sum_score
用一个变量sum_scoreDF把上面的表接收一下 ,
stu 和 sum_score DF现在我关联这2张表,使用id 和student_id 连接
格式:表1.merge(表2,left_on='表1中的关联字段',right_on='表2中的关联字段',how='连接方式可以选择:left,right,inner')
drop() 删除一列的数据
上面的表连接后出现了重复字段,我们可以从上面的表中把列一个一个挑出来,不过那样太麻烦了,可以直接删除一列drop('索引',axsi='0或者1'),0轴和1轴是numpy中使用坐标的时候也用到的,我们可以看成是一个第四象限的坐标,横向是1轴,纵向是0轴
我怕们指定axis,就是在垂直水平方向切一刀
排名rank()
rank方法通常要传的参数:method可以选择排名方法(与hive中的一样)
默认是升序排序,我们求topn问题就需要排序是降序:acending=False,是开启值从大到小排序
stu_sum_scoreDF['first_rank'] = stu_sum_scoreDF.groupby('clazz')['sum_score'].rank(method='first',ascending=False)
stu_sum_scoreDF['min_rank'] = stu_sum_scoreDF.groupby('clazz')['sum_score'].rank(method='min',ascending=False)
stu_sum_scoreDF['max_rank'] = stu_sum_scoreDF.groupby('clazz')['sum_score'].rank(method='max',ascending=False)
stu_sum_scoreDF['dense_rank'] = stu_sum_scoreDF.groupby('clazz')['sum_score'].rank(method='dense',ascending=False)
stu_sum_scoreDF['average_rank'] = stu_sum_scoreDF.groupby('clazz')['sum_score'].rank(method='average',ascending=False)
first:从1开始到最后每有排名重复的
min:排名有重复,如果值相等按照小的写
max:排名有重复,如果值相等按照大的写
dense:和min一样排名有重复,如果值相等按照小的写
average:排名有重复,如果值相等按照重复位置的排名平均数的写
还是不太清楚的可以看看这张图
筛选first_rank<3的,完成分组求topn问题
import seaborn as sns
import matplotlib.pyplot as plt
# windows解决中文乱码
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
plt.figure(figsize=(16,8))#设置画布的大小
plt.title("班级总分TOP3")#设置标题
sns.barplot(x="clazz", y="sum_score", hue="first_rank",data=clazz_top3)
plt.xlabel("班级") //设置x轴的标签
plt.ylabel("总成绩") //设置y轴的标签
plt.ylim(400,650) //截取y轴的长度
plt.show() //关闭日志信息