这是一份Pandas数据处理复习学案
Pandas数据处理复习
1、读取数据和保存数据
pd.read_csv(filename):从CSV文件导入数据 pd.read_excel(filename):从Excel文件导入数据
df.to_csv(filename):导出数据到CSV文件 df.to_excel(filename):导出数据到Excel文件
选择数据
df.head(n):查看DataFrame对象的前n行 df.tail(n):查看DataFrame对象的最后n行
df[col]:根据列名选择某一列数据,并以Series的形式返回列,或者也可以用df.col,注意不需要加引号
df[[col1, col2]]:选择多列数据,以DataFrame形式返回多列,多列的列名需要[ ]括起来
根据条件进行选择,方法是:df[条件],例如df[df[col] > 0.5]:选择col列的值大于0.5的行,[ ]里面列数据要加上数据源,而不能只写列名,df[col > 0.5] 这样写是错误的
如果索引是0开始的数字,则可以通过索引切片来选择相应的行
df[0:] #第0行及之后的行,相当于df的全部数据,注意冒号是必须的
df[:2] #第2行之前的数据(不含第2行)
df[0:1] #第0行
df[1:3] #第1行到第2行(不含第3行)
df[-1:] #最后一行
数据处理
排序分组
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2, ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
删除空值的行或列(一般的题目很少看到)
df.dropna():删除所有包含空值的行,括号中默认参数为axis=0,表示对行操作
df.dropna(axis=1):删除所有包含空值的列
计算,这些计算方法对原数据可以用,对分组排序后的数据都可以用
df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值 df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值 df.min():返回每一列的最小值
具体实例及结果(上表是源数据)
1、读取数据
df=pd.read_excel("销售数据.xlsx")
print(df) #输出原始数据
(结果显示,原来的列名-》列标题,并且自动添加索引,从0开始)
书名 作者 译作者 出版社 原价 售价 数量 销售额
0 双城记 查尔斯·狄更斯 李妍 中国华侨出版社 39.8 24.9 1.0 NaN
1 局外人 阿尔贝·加缪 馨文 中国华侨出版社 22.8 14.3 1.0 NaN
2 夜莺与玫瑰 奥斯卡·王尔德 张炽恒 开明出版社 46.0 28.8 1.0 NaN
3 鲁滨孙漂流记 丹尼尔·笛福 辛怡 开明出版社 39.8 28.7 1.0 NaN
4 Python基础教程 Magnus Lie Hetland 袁国忠 清华大学出版社 99.0 69.8 2.0 NaN
5 算法导论 Thomas H.Cormen等 殷建平等 清华大学出版社 128.0 102.4 1.0 NaN
2、计算(这种计算非常简单,不需要考虑一个个相乘,直接用列数据相乘就可以了,数据自己会一一对应。
df.销售额=df.售价*df.数量
书名 作者 译作者 出版社 原价 售价 数量 销售额
0 双城记 查尔斯·狄更斯 李妍 中国华侨出版社 39.8 24.9 1.0 24.9
1 局外人 阿尔贝·加缪 馨文 中国华侨出版社 22.8 14.3 1.0 14.3
2 夜莺与玫瑰 奥斯卡·王尔德 张炽恒 开明出版社 46.0 28.8 1.0 28.8
3 鲁滨孙漂流记 丹尼尔·笛福 辛怡 开明出版社 39.8 28.7 1.0 28.7
4 Python基础教程 Magnus Lie Hetland 袁国忠 清华大学出版社 99.0 69.8 2.0 139.6
5 算法导论 Thomas H.Cormen等 殷建平等 清华大学出版社 128.0 102.4 1.0 102.4
3、分别查看各种数据,注意数据都是有索引的
书名 作者
0 双城记 查尔斯·狄更斯
1 局外人 阿尔贝·加缪
2 夜莺与玫瑰 奥斯卡·王尔德
3 鲁滨孙漂流记 丹尼尔·笛福
4 Python基础教程 Magnus Lie Hetland
5 算法导论 Thomas H.Cormen等
>>> df["书名"] >>>df[["书名","作者"]]
0 双城记
1 局外人
2 夜莺与玫瑰
3 鲁滨孙漂流记
4 Python基础教程
5 算法导论
Name: 书名, dtype: object
带索引,且是Series结构 带索引,且是DataFrame结构
>>> df.index #一维结构
Int64Index([0, 1, 2, 3, 4, 5], dtype='int64')
>>> df.columns #一维结构
Index(['书名', '作者', '译作者', '出版社', '原价', '售价', '数量', '销售额'], dtype='object')
>>> df.values #如果是DataFrame数据结果,即有多列数据,df.values应该是个二维数组
array( [['双城记', '查尔斯·狄更斯', '李妍', '中国华侨出版社', 39.8, 24.9, 1, 24.9],
['局外人', '阿尔贝·加缪', '馨文', '中国华侨出版社', 22.8, 14.3, 1, 14.3],
['夜莺与玫瑰', '奥斯卡·王尔德', '张炽恒', '开明出版社', 46.0, 28.8, 1, 28.8],
['鲁滨孙漂流记', '丹尼尔·笛福', '辛怡', '开明出版社', 39.8, 28.7, 1, 28.7],
['Python基础教程', 'Magnus Lie Hetland', '袁国忠', '清华大学出版社', 99.0, 69.8,
2, 139.6],
['算法导论', 'Thomas H.Cormen等', '殷建平等', '清华大学出版社', 128.0, 102.4, 1,
102.4]] , dtype=object)
如果要逐个访问这3个属性里面的值,一般用for循环配合,如下面代码
双城记
局外人
夜莺与玫瑰
鲁滨孙漂流记
Python基础教程
算法导论
for i in df.index: #访问每个索引
print(i)
扩展应用,利用索引输出每一本书的名字
for i in df.index:
print(df.at[i,"书名"]) #或者:print(df.["书名"][i])
李妍
馨文
张炽恒
辛怡
袁国忠
殷建平等
或者直接通过遍历某列的值,比如实现上面同样的结果
for i in df.书名:
print(i)
假如现在要通过values属性来访问某些值,例如
for a in df.values: #用a代表值当中的每一项
print(a[2]) #输出译作者
总结:由此我们一定要看清楚for后面的值范围,迭代变量每次代表的值是什么。
4、数据计算(分组前)(常用函数的使用,这是数据的笼统使用,看看下面的几个框中的结果,最大值,最小值,统计个数不管是“文字”类型、“数值”类型,都有,但是平均分只有数值类型,文字数据自动忽略平均值了,假如原数据中只有一列是数值型数据,这样就可以得出了)
>>> df.mean()
原价 62.566667
售价 44.816667
数量 1.166667
销售额 56.450000
dtype: float64
注意:文字列数据没有平均值,只有数值列才有,结果也是一维结构
>>> df.count()
书名 6
作者 6
译作者 6
出版社 6
原价 6
售价 6
数量 6
销售额 6
dtype: int64 一维
>>> df.max() #每一列的最大值
书名 鲁滨孙漂流记
作者 阿尔贝·加缪
译作者 馨文
出版社 清华大学出版社
原价 128.0
售价 102.4
数量 2
销售额 139.6
dtype: object #一维结构
对于上面的元数据求值计算,我们可以加上具体列标题就可以计算指定的数值
>>> df.原价.max()
128.0
>>> df["原价"].max()
128.0
>>>
数据分组后计算
>>> df.groupby("出版社") #直接看不到数据,需要循环迭代
('中国华侨出版社', 书名 作者 译作者 出版社 原价 售价 数量 销售额
0 双城记 查尔斯·狄更斯 李妍 中国华侨出版社 39.8 24.9 1 24.9
1 局外人 阿尔贝·加缪 馨文 中国华侨出版社 22.8 14.3 1 14.3)
('开明出版社', 书名 作者 译作者 出版社 原价 售价 数量 销售额
2 夜莺与玫瑰 奥斯卡·王尔德 张炽恒 开明出版社 46.0 28.8 1 28.8
3 鲁滨孙漂流记 丹尼尔·笛福 辛怡 开明出版社 39.8 28.7 1 28.7)
('清华大学出版社', 书名 作者 译作者 出版社 原价 售价 数量 销售额
4 Python基础教程 Magnus Lie Hetland 袁国忠 清华大学出版社 99.0 69.8 2 139.6
5 算法导论 Thomas H.Cormen等 殷建平等 清华大学出版社 128.0 102.4 1 102.4)
我们一般不直接用这些数据,而是用分组之后的数据进行计算统计,例如
>>> g1=df.groupby("出版社").mean() #默认情况下,分组字段是作为索引的
>>> g2=df.groupby("出版社",as_index=False).mean() #以出版社分组计算平均值,注意参数as_index=False
>>> g1
原价 售价 数量 销售额
出版社
中国华侨出版社 31.3 19.60 1.0 19.60
开明出版社 42.9 28.75 1.0 28.75
清华大学出版社 113.5 86.10 1.5 121.00
>>> g2 #有新索引
出版社 原价 售价 数量 销售额
0 中国华侨出版社 31.3 19.60 1.0 19.60
1 开明出版社 42.9 28.75 1.0 28.75
2 清华大学出版社 113.5 86.10 1.5 121.00
>>> g1.index #分组依据就是索引
Index(['中国华侨出版社', '开明出版社', '清华大学出版社'], dtype='object', name='出版社')
>>> g2.index #分组依据不作为索引,索引重新生成,从0开始
Int64Index([0, 1, 2], dtype='int64')
而且仔细看输出数据,形式都不一样,特别是分组字段
数据排序(以另外数据作为说明)
>>> df5 #原数据
name team Q1 Q2 Q3 Q4
0 liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
>>> df5.sort_values("team") #以一列数据升序
Name team Q1 Q2 Q3 Q4
2 Ack A 57 60 18 84
1 Arry C 36 37 37 57
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
0 liver E 89 21 24 64
>>> df5.sort_values(["team","Q1"]) #以两列数据排序
name team Q1 Q2 Q3 Q4
2 Ack A 57 60 18 84
1 Arry C 36 37 37 57
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
0 liver E 89 21 24 64
#以两列数据都降序 ,如果参数改成:ascending = [False,True],结果会怎样
>>> df5.sort_values(by = ['team','Q1'], ascending = False)
name team Q1 Q2 Q3 Q4
0 liver E 89 21 24 64
4 Oah D 65 49 61 86
3 Eorge C 93 96 71 78
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
排序之后一般是为了取前面或后面几个
>>>df2= df.sort_values("销售额",ascending=False)
>>> df5.tail(2) #取尾几个
name team Q1 Q2 Q3 Q4
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
>>> df5.head(2) #取前几个
name team Q1 Q2 Q3 Q4
0 liver E 89 21 24 64
1 Arry C 36 37 37 57
>>> df7=df5.drop("Q1",axis=1)
>>> df7
name team Q2 Q3 Q4
0 liver E 21 24 64
1 Arry C 37 37 57
2 Ack A 60 18 84
3 Eorge C 96 71 78
4 Oah D 49 61 86
#删除Q1列数据,必须加axis=1,否则出错
几个非常重要的参数(以上面的数据为例)
>>> df6=df5.drop(0,axis=0)
>>> df6
name team Q1 Q2 Q3 Q4
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
1、axis参数的使用
2、as_index参数,是否作为索引,默认值是True,特别是分组的时候经常用到,上面有例子说明
3、ignore_index,是否忽略索引,默认值是False,看例子(忽略自身的索引)
>>> df5.append({"name":"fde","team":"D","Q1":45,"Q2":54,"Q3":38,"Q4":68},ignore_index=True)
>>> df5[:2:3] #索引切片,可以选择指定范围内的行
name team Q1 Q2 Q3 Q4
0 liver E 89 21 24 64
name team Q1 Q2 Q3 Q4
0 liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
>>> f5.sort_values("Q4",ignore_index=True)
name team Q1 Q2 Q3 Q4
0 Arry C 36 37 37 57
1 liver E 89 21 24 64
2 Eorge C 93 96 71 78
3 Ack A 57 60 18 84
4 Oah D 65 49 61 86
忽略了原来的索引,重新生成索引
5 fde D 45 54 38 68
>>> df5.sort_values("Q4")
name team Q1 Q2 Q3 Q4
1 Arry C 36 37 37 57
0 liver E 89 21 24 64
3 Eorge C 93 96 71 78
2 Ack A 57 60 18 84
4 Oah D 65 49 61 86
注意:原来的索引乱了
补充axis=0(行),axis=1(列)相关例子
并增加一列“total”,计算每个人的总分、最高分(数据显示这是一维的数据结构)
>>> max=df.max(axis=1)
>>> max
0 198
1 167
2 219
3 338
4 261
dtype: int64
>>> total=df.sum(axis=1) #只计算数值类型的数据
>>> total
0 396
1 334
2 438
3 676
4 522
dtype: int64
>>> df["total"]=df[["Q1","Q2","Q3","Q4"]].sum(axis=1) #指定计算哪几列,注意参数axis=1
name team Q1 Q2 Q3 Q4 total
0 liver E 89 21 24 64 198
1 Arry C 36 37 37 57 167
2 Ack A 57 60 18 84 219
3 Eorge C 93 96 71 78 338
4 Oah D 65 49 61 86 261
4、ascending排序时默认升序,即ascending=True,前面有例子
5、inplace 是否在原地修改数据,默认值时inplace=False,即不修改
7.Excel 文件 cj.xlsx 中的数据包含“准考证号”、“姓名”、“学号”、“班级”、“总分”字
段,以及若干个数据行。则下列程序段执行后对象 df 中的数据将( A)
import pandas as pd
df=pd.read_excel("cj.xlsx")
df.append({"准考证号":"2059618","姓名":"李雷","学号":"35","班级":"213","总分":560},ignore_index=True)
df.drop("学号",axis=1)
df.sort_values("班级")
A.与从 Excel 中读取时保持一致,没有变化 B.减少“学号”列数据
C.按照“班级”升序排序 D.最后增加了一行“李雷”同学的相关数据
作图:先确定数据来源,然后在选择作图类型,所以作图的时候务必要搞清楚作图前的数据样子,是分组前的原始数据,还是分组后的数据,分组依据是索引,还是作为普通数据,作图时一定要搞清楚x轴是第一列数据,后面都是y轴数据,当然你可以进行选择。
书名 作者 译作者 出版社 原价 售价 数量 销售额
0 双城记 查尔斯·狄更斯 李妍 中国华侨出版社 39.8 24.9 1.0 24.9
1 局外人 阿尔贝·加缪 馨文 中国华侨出版社 22.8 14.3 1.0 14.3
2 夜莺与玫瑰 奥斯卡·王尔德 张炽恒 开明出版社 46.0 28.8 1.0 28.8
3 鲁滨孙漂流记 丹尼尔·笛福 辛怡 开明出版社 39.8 28.7 1.0 28.7
4 Python基础教程 Magnus Lie Hetland 袁国忠 清华大学出版社 99.0 69.8 2.0 139.6
5 算法导论 Thomas H.Cormen等 殷建平等 清华大学出版社 128.0 102.4 1.0 102.4
>>> df.plot(kind="bar") #第一列数据是x轴
>>> plt.show()
>>> g1=df.groupby("出版社").mean() #默认情况下,分组字段是作为索引的
>>> g2=df.groupby("出版社",as_index=False).mean() #以出版社分组计算平均值,注意参数
>>> g1.plot(kind="bar")
>>> plt.show()
>>> x=df["书名"]
>>> y=df["销售额"]
>>> plt.bar(x,y)
>>> plt.show()
自己再总结作图的两种方法。书名作者译作者出版社原价售价数量销售额双城记查尔斯·狄更斯李妍中国华侨出版社39.824.91局外人阿尔贝·加缪馨文中国华侨出版社22.814.31夜莺与玫瑰奥斯卡·王尔德张炽恒开明出版社4628.81鲁滨孙漂流记丹尼尔·笛福辛怡开明出版社39.828.71机器学习周志华 清华大学出版社88662Python基础教程Magnus Lie Hetland袁国忠清华大学出版社9969.82算法导论Thomas H.Cormen等殷建平等清华大学出版社128102.41人工智能