Python全栈开发-数据分析-02 Pandas详解 (上)
2021/7/30 14:08:27
本文主要是介绍Python全栈开发-数据分析-02 Pandas详解 (上),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Pandas详解 (上)
一. 安装pandas
1.按Win+R,输入CMD确定,
输入 pip install pandas
回车
还要安装xlrd,否则你打不开Excel文件
pip install xrld
二. 数据类型与新建文件
数据类型 | 说明 | 新建方法 |
---|---|---|
csv、tsv、txt | 用逗号分隔、tab分割的纯文本文件 | pd.to_csv |
excel | xls或xlsx | pd.to_excel |
mysql | 关系数据库表 | pd.to_sql |
2.1 新建空白Excel文件
示例 :
import pandas as pd path = 'c:/pandas/新建空白文件.xlsx' data = pd.DataFrame( ) data.to_excel(path) print('新建空白文件.xlsx成功')
2.2 新建文件同时写入数据
案例 :
import pandas as pd path = r'E:\Desktop\text\新建空白文件.xlsx' data=pd.DataFrame({'id':[1,2,3],'姓名':['叶问','李小龙','落空空']}) data.to_excel(path) print('新建空白文件.xlsx成功')
运行结果如下:
新建空白文件.xlsx成功
并在对应文件夹内成功创建excel表格,内容与其一致
2.3 将id设置为索引
案例 :
import pandas as pd path = r'E:\Desktop\text\新建空白文件.xlsx' data = pd.DataFrame({'id':[1,2,3],'姓名':['叶问','李小龙','落空空']}) # 写入的数据 data = data.set_index('id') # 将id设置为索引 data.to_excel(path) # 将数据写入Excel文件 print(data)
运行结果为:
姓名 id 1 叶问 2 李小龙 3 落空空
三. 读取数据
数据类型 | 说明 | 读取方法 |
---|---|---|
csv、tsv、txt | 默认逗号分隔 | pd.read_csv |
csv、tsv、txt | 默认\t分隔 | pd.read_table |
excel | xls或xlsx | pd.read_excel |
mysql | 关系数据库表 | pd.read_sql |
3.1 读取CSV文件
案例:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.csv' data = pd.read_csv(path) print(data) print('==='*20) # 二、查看前几行数据 print(data.head()) # 默认是5行,指定行数写小括号里 print('==='*20) # 三、查看数据的形状,返回(行数、列数) print(data.shape) print('==='*20) # 四、 查看列名列表 print(data.columns) print('==='*20) # 五、查看索引列 print(data.index) print('==='*20) # 六、查看每一列数据类型 print(data.dtypes)
运行结果为:
Unnamed: 0 男 杨过 19 13901234567 终南山古墓 2000/1/1 0 0 女 小龙女 25 13801111111 终南山古墓 2000/1/2 1 1 男 郭靖 40 13705555555 湖北襄阳 2020/1/1 2 2 女 黄蓉 35 13601111111 湖北襄阳 2000/1/4 3 3 男 张无忌 18 13506666666 明教 2000/1/5 4 4 女 周芷若 17 13311111111 明教 2000/1/6 5 5 女 赵敏 17 18800000000 明教 2000/1/7 ============================================================ Unnamed: 0 男 杨过 19 13901234567 终南山古墓 2000/1/1 0 0 女 小龙女 25 13801111111 终南山古墓 2000/1/2 1 1 男 郭靖 40 13705555555 湖北襄阳 2020/1/1 2 2 女 黄蓉 35 13601111111 湖北襄阳 2000/1/4 3 3 男 张无忌 18 13506666666 明教 2000/1/5 4 4 女 周芷若 17 13311111111 明教 2000/1/6 ============================================================ (6, 7) ============================================================ Index(['Unnamed: 0', '男', '杨过', '19', '13901234567', '终南山古墓', '2000/1/1'], dtype='object') ============================================================ RangeIndex(start=0, stop=6, step=1) ============================================================ Unnamed: 0 int64 男 object 杨过 object 19 int64 13901234567 int64 终南山古墓 object 2000/1/1 object dtype: object
3.2 自己制定分隔符、列名
案例:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.xlsx' data = pd.read_excel(path, header=None, names=['序号', '姓名', '年龄', '手机', '地址', '入职日期'],index_col='序号') print(data)
运行结果为:
姓名 年龄 手机 地址 入职日期 序号 序号 姓名 年龄 手机 地址 入职日期 序号 姓名 年龄 手机 地址 入职日期 序号 姓名 年龄 手机 地址 入职日期 1 杨过 19 13901234567 终南山古墓 2000-01-01 00:00:00 2 小龙女 25 13801111111 终南山古墓 2000-01-02 00:00:00 3 郭靖 40 13705555555 湖北襄阳 2000-01-03 00:00:00 4 黄蓉 35 13601111111 湖北襄阳 2000-01-04 00:00:00 5 张无忌 18 13506666666 明教 2000-01-05 00:00:00 6 周芷若 17 13311111111 明教 2000-01-06 00:00:00 7 赵敏 17 18800000000 明教 2000-01-07 00:00:00
注意:你的txt文档必需另存为utf-8编码,如果是ASCII报错
参数 | 描述 |
---|---|
sep | 分隔符或正则表达式 sep=’\s+’ |
header | 列名的行号,默认0(第一行),如果没有列名应该为None |
names | 列名,与header=None一起使用 |
index_col | 索引的列号或列名,可以是一个单一的名称或数字,也可以是一个分层索引 |
skiprows | 从文件开始处,需要跳过的行数或行号列表 |
encoding | 文本编码,例如utf-8 |
nrows | 从文件开头处读入的行数 nrows=3 |
3.3 txt文件转csv文件
案例 :
import pandas as pd data = pd.read_csv(r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.txt') data.to_csv(r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.csv') print(data)
运行结果为:
男 杨过 19 13901234567 终南山古墓 2000/1/1 0 女 小龙女 25 13801111111 终南山古墓 2000/1/2 1 男 郭靖 40 13705555555 湖北襄阳 2020/1/1 2 女 黄蓉 35 13601111111 湖北襄阳 2000/1/4 3 男 张无忌 18 13506666666 明教 2000/1/5 4 女 周芷若 17 13311111111 明教 2000/1/6 5 女 赵敏 17 18800000000 明教 2000/1/7
3.4 读取MySQL数据库
案例 :
import pandas as pd import pymysql pd_sql = pymysql.connect(host='localhost', user='这里填用户', password='这里填密码', database='这里填数据库名', charset='utf8') data = pd.read_sql('select * from class1', con=这里填连接对象) print(data)
3.5 读取Excel文件
案例:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.xlsx' data = pd.read_excel(path, header=None, names=['序号', '姓名', '年龄', '手机', '地址', '入职日期'],index_col='序号') print(data) data.to_excel(path) # 写入到Excel文件
运行结果为:
注意 : 在这里刚开始不能正常保存excel文件
后来安装了pyexcel-xls才能正常保存
pip install pyexcel-xls
姓名 年龄 手机 地址 入职日期 序号 1 杨过 19 13901234567 终南山古墓 2000-01-01 2 小龙女 25 13801111111 终南山古墓 2000-01-02 3 郭靖 40 13705555555 湖北襄阳 2000-01-03 4 黄蓉 35 13601111111 湖北襄阳 2000-01-04 5 张无忌 18 13506666666 明教 2000-01-05 6 周芷若 17 13311111111 明教 2000-01-06 7 赵敏 17 18800000000 明教 2000-01-07
案例 :
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件001-005\读取文件.xlsx' data = pd.read_excel(path) # 二、查看前几行数据 print(data.head()) # 默认是5行,指定行数写小括号里 print('==='*20) # 三、查看数据的形状,返回(行数、列数) print(data.shape) print('==='*20) # 四、 查看列名列表 print(data.columns) print('==='*20) # 五、查看索引列 print(data.index) print('==='*20) # 六、查看每一列数据类型 print(data.dtypes)
运行结果为:
序号 姓名 年龄 手机 地址 入职日期 0 1 杨过 19 13901234567 终南山古墓 2000-01-01 1 2 小龙女 25 13801111111 终南山古墓 2000-01-02 2 3 郭靖 40 13705555555 湖北襄阳 2000-01-03 3 4 黄蓉 35 13601111111 湖北襄阳 2000-01-04 4 5 张无忌 18 13506666666 明教 2000-01-05 ============================================================ (7, 6) ============================================================ Index(['序号', '姓名', '年龄', '手机', '地址', '入职日期'], dtype='object') ============================================================ RangeIndex(start=0, stop=7, step=1) ============================================================ 序号 int64 姓名 object 年龄 int64 手机 int64 地址 object 入职日期 datetime64[ns] dtype: object
自己设置并写入表头的两种方法:
第一种:
import pandas as pd path= 'c:/pandas/读取文件.xlsx' data = pd.read_excel(path,header=None) data.columns=['序号','姓名','年龄','地址','电话','入职日期'] # 给每个列重复设置表头 data=data.set_index('序号') # 重新指定索引列 print(data.columns) # 查看列名列表 data.to_excel(path) # 写入到Excel文件
第二种:
import pandas as pd path= 'c:/pandas/读取文件.xlsx' data = pd.read_excel(path,header=None,index_col='序号') data.columns=['序号','姓名','年龄','地址','电话','入职日期'] # 给每个列重复设置表头 data=data.set_index('序号',inplace=True) # 只在index上面改,不要生成新的 print(data.columns) # 查看列名列表,index和columns是分开的 data.to_excel(path) # 写入到Excel文件
推荐方法:
import pandas as pd path= 'c:/pandas/读取文件.xlsx' data = pd.read_excel(path,header=None,names=['序号','姓名','年龄','手机','地址','入职日期'],index_col='序号') print(data) data.to_excel(path)
四. pandas数据结构
DataFrame:二维数据,整个表格,多行多列 【简称df】
df.index:索引列
df.columns:列名
Series:一维数据,一行或一列
4.1 Series 一维数据,一行或一列
Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。
4.1.1 仅有数据列表即可产生最简单的Series
案例 :
import pandas as pd data= pd.Series([520,'落空空',1314,'2021-07-30']) # 左侧是索引,右侧是数据 print(data) print('==='*20) print(data.index) # 获取索引,返回索引的(起始值,结束值,步长) print('==='*20) print(data.values) # 获取数据,返回值序列,打印元素值的列表
运行结果为:
0 520 1 落空空 2 1314 3 2021-07-30 dtype: object ============================================================ RangeIndex(start=0, stop=4, step=1) ============================================================ [520 '落空空' 1314 '2021-07-30']
4.1.2 我们指定Series的索引
案例:
import pandas as pd data= pd.Series([520,'落空空',1314,'2021-07-30'],index=['a','b','c','d']) # 指定索引 print(data) print('==='*20) print(data.index) # 返回指定的索引
运行结果为:
a 520 b 落空空 c 1314 d 2021-07-30 dtype: object ============================================================ Index(['a', 'b', 'c', 'd'], dtype='object')
4.1.3 使用Python字典创建Series
案例:
import pandas as pd dict1={'姓名':'落空空','性别':'男','年龄':'20','地址':'花果山水帘洞'} data=pd.Series(dict1) print(data) print('==='*20) print(data.index) # 返回key
运行结果为:
姓名 落空空 性别 男 年龄 20 地址 花果山水帘洞 dtype: object ============================================================ Index(['姓名', '性别', '年龄', '地址'], dtype='object')
4.1.4 根据标签索引查询数据
案例:
print(data) # 查询整个字典 print(data['姓名']) # 通过key可以查对应的值 print(type(data['年龄'])) # 通过key可以查对应值的类型 print('==='*20) print(data[['姓名','年龄']]) # 通过多个key查对应的值 print(type(data[['姓名','年龄']])) # 注意:他不返回值的类型,而返回Series
运行结果为:
姓名 落空空 性别 男 年龄 20 地址 花果山水帘洞 dtype: object 落空空 <class 'str'> ============================================================ 姓名 落空空 年龄 20 dtype: object <class 'pandas.core.series.Series'>
4.1.5 键和值存在两个列表中,创建Series
案例:
import pandas as pd list1 = ['姓名','性别','年龄'] list2 = ['落空空','男',20] data = pd.Series(list2,index=list1) # 指定谁是索引 print(data)
运行结果为:
姓名 落空空 性别 男 年龄 20 dtype: object
4.1.6 Series常用方法
#常用方法 数据.index #查看索引 数据.values #查看数值 数据.isnull() #查看为空的,返回布尔型 数据.notnull() 数据.sort_index() #按索引排序 数据.sort_values() #按数值排序
4.2 认识DataFrame
每列可以是不同的值类型(数值、字符串、布尔值等)
• 既有行索引index,也有列索引columns
• 可以被看做由Series组成的字典
• DataFrame是一个表格型的数据结构
创建DataFrame最常用的方法,参考读取CSV、TXT、Excel、MySQL等
案例 :
import pandas as pd data=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['a','b','c']) print(data) print('==='*20) print(data['a'][0] ) print('==='*20) print(data.loc[0]['a'] ) print('==='*20) print(data.iloc[0][0] ) print('==='*20) print(data[['a','b']])
运行结果为:
a b c 0 1 2 3 1 4 5 6 2 7 8 9 ============================================================ 1 ============================================================ 1 ============================================================ 1 ============================================================ a b 0 1 2 1 4 5 2 7 8
4.2.1 DataFrame 整个表格
案例:
import pandas as pd dict1 = { '姓名':['落空空','李小龙','叶问'], '年龄':[20,80,127], '功夫':['撸铁','截拳道','咏春'] } data = pd.DataFrame(dict1) print(data) print('==='*20) print(data.dtypes) # 返回每一列的类型 print('==='*20) print(data.columns) # 返回列索引,以列表形式返回:[列名1,列名2,…] print('==='*20) print(data.index) # 返回行索引,(起始,结束,步长)
运行结果为:
姓名 年龄 功夫 0 落空空 20 撸铁 1 李小龙 80 截拳道 2 叶问 127 咏春 ============================================================ 姓名 object 年龄 int64 功夫 object dtype: object ============================================================ Index(['姓名', '年龄', '功夫'], dtype='object') ============================================================ RangeIndex(start=0, stop=3, step=1)
4.2.2 从DataFrame中查询出Series
案例:
# 如果只查询一列,返回的是pd.Series print(data['姓名']) # 返回索引和这一列数据 print('==='*20) # 如果只查询一行,返回的是pd.Series print(data.loc[1]) # 这时,它的索引是列名 print('==='*20) # 如果查询多列,返回的是pd.DataFrame print(data[['姓名','年龄']]) # 返回索引和这两列数据 print('==='*20) # 如果查询多行,返回的是pd.DataFrame print(data.loc[1:3]) # 返回前3行,包括结束值
运行结果为:
0 落空空 1 李小龙 2 叶问 Name: 姓名, dtype: object ============================================================ 姓名 李小龙 年龄 80 功夫 截拳道 Name: 1, dtype: object ============================================================ 姓名 年龄 0 落空空 20 1 李小龙 80 2 叶问 127 ============================================================ 姓名 年龄 功夫 1 李小龙 80 截拳道 2 叶问 127 咏春
4.2.3 将多个Series加入DataFrame
案例:
import pandas as pd data1 = pd.Series(['叶问','李小龙','落空空'],index=[1,2,3],name='姓名') data2 = pd.Series(['男','男','男'],index=[1,2,3],name='性别') data3 = pd.Series([127,80,20],index=[1,2,3],name='年龄') table1 = pd.DataFrame({data1.name:data1,data2.name:data2,data3.name:data3}) print(table1)
运行结果为:
姓名 性别 年龄 1 叶问 男 127 2 李小龙 男 80 3 落空空 男 20
4.2.4 DataFrame常用方法
# 常用方法 数据.head( 5 ) #查看前5行 数据.tail( 3 ) #查看后3行 数据.values #查看数值 数据shape #查看行数、列数 数据.fillna(0) #将空值填充0 数据.replace( 1, -1) #将1替换成-1 数据.isnull() #查找数据中出现的空值 数据.notnull() #非空值 数据.dropna() #删除空值 数据.unique() #查看唯一值 数据.reset_index() #修改、删除,原有索引,详见例1 数据.columns #查看数据的列名 数据.index #查看索引 数据.sort_index() #索引排序 数据.sort_values() #值排序 pd.merge(数据1,数据1) #合并 pd.concat([数据1,数据2]) #合并,与merge的区别,自查 pd.pivot_table( 数据 ) #用df做数据透视表(类似于Excel的数透)
五. 连接查询
5.1 Merge
首先merge的操作非常类似sql里面的join
,实现将两个Dataframe
根据一些共有的列连接起来,当然,在实际场景中,这些共有列一般是Id,
连接方式也丰富多样,可以选择inner(默认),left,right,outer 这几种模式,分别对应的是内连接,左连接,右连接,全外连接
5.1.1 InnerMerge (内连接)
内连接的参数on
和how
可以省略
数据3 = pd.merge(数据1,数据2,on='姓名',how='inner')
连接后,显示两个表内的公有数据(交集)
案例 :
import numpy as np import pandas as pd data1= pd.DataFrame({'姓名':['叶问','李小龙','落空空','李小龙','叶问','叶问'],'出手次数1':np.arange(6)}) data2 = pd.DataFrame({'姓名':['黄飞鸿','落空空','李小龙'],'出手次数2':[1,2,3]}) data3 = pd.merge(data1,data2) print(data1) print('==='*20) print(data2) print('==='*20) print(data3)
运行结果为:
李小龙和落空空在data1和data2中都存在,所以都存入data3
姓名 出手次数1 0 叶问 0 1 李小龙 1 2 落空空 2 3 李小龙 3 4 叶问 4 5 叶问 5 ============================================================ 姓名 出手次数2 0 黄飞鸿 1 1 落空空 2 2 李小龙 3 ============================================================ 姓名 出手次数1 出手次数2 0 李小龙 1 3 1 李小龙 3 3 2 落空空 2 2
5.1.2 LeftMerge (左连接)
以左边参数的表为标准,右边的表链接进去
案例 :
import numpy as np import pandas as pd data1= pd.DataFrame({'姓名':['叶问','李小龙','落空空','李小龙','叶问','叶问'],'出手次数1':np.arange(6)}) data2 = pd.DataFrame({'姓名':['黄飞鸿','落空空','李小龙'],'出手次数2':[1,2,3]}) data3 = pd.merge(data1,data2,on='姓名',how='left') print(data1) print('==='*20) print(data2) print('==='*20) print(data3)
运行结果为:
姓名 出手次数1 0 叶问 0 1 李小龙 1 2 落空空 2 3 李小龙 3 4 叶问 4 5 叶问 5 ============================================================ 姓名 出手次数2 0 黄飞鸿 1 1 落空空 2 2 李小龙 3 ============================================================ 姓名 出手次数1 出手次数2 0 叶问 0 NaN 1 李小龙 1 3.0 2 落空空 2 2.0 3 李小龙 3 3.0 4 叶问 4 NaN 5 叶问 5 NaN
5.1.3 RightMerge (右连接)
以右边参数的表为标准,左边的表链接进去
案例:
import numpy as np import pandas as pd data1= pd.DataFrame({'姓名':['叶问','李小龙','落空空','李小龙','叶问','叶问'],'出手次数1':np.arange(6)}) data2 = pd.DataFrame({'姓名':['黄飞鸿','落空空','李小龙'],'出手次数2':[1,2,3]}) data3 = pd.merge(data1,data2,on='姓名',how='right') print(data1) print('==='*20) print(data2) print('==='*20) print(data3)
运行结果为:
姓名 出手次数1 0 叶问 0 1 李小龙 1 2 落空空 2 3 李小龙 3 4 叶问 4 5 叶问 5 ============================================================ 姓名 出手次数2 0 黄飞鸿 1 1 落空空 2 2 李小龙 3 ============================================================ 姓名 出手次数1 出手次数2 0 黄飞鸿 NaN 1 1 落空空 2.0 2 2 李小龙 1.0 3 3 李小龙 3.0 3
5.1.4 OuterMerge (全连接)
两张表的联合(并集)
案例:
import numpy as np import pandas as pd data1= pd.DataFrame({'姓名':['叶问','李小龙','落空空','李小龙','叶问','叶问'],'出手次数1':np.arange(6)}) data2 = pd.DataFrame({'姓名':['黄飞鸿','落空空','李小龙'],'出手次数2':[1,2,3]}) data3 = pd.merge(data1,data2,on='姓名',how='outer') print(data1) print('==='*20) print(data2) print('==='*20) print(data3)
运行结果为:
姓名 出手次数1 0 叶问 0 1 李小龙 1 2 落空空 2 3 李小龙 3 4 叶问 4 5 叶问 5 ============================================================ 姓名 出手次数2 0 黄飞鸿 1 1 落空空 2 2 李小龙 3 ============================================================ 姓名 出手次数1 出手次数2 0 叶问 0.0 NaN 1 叶问 4.0 NaN 2 叶问 5.0 NaN 3 李小龙 1.0 3.0 4 李小龙 3.0 3.0 5 落空空 2.0 2.0 6 黄飞鸿 NaN 1.0
5.1.5 MultipleKey Merge (基于多个key上的merge)
刚才我们都是仅仅实现的在一个key上的merge,当然我们也可以实现基于多个keys的merge
案例:
import pandas as pd data1 = pd.DataFrame({'姓名': ['张三', '张三', '王五'],'班级': ['1班', '2班', '1班'],'分数': [10,20,30]}) print(data1) print('==='*20) data2 = pd.DataFrame({'姓名': ['张三', '张三', '王五','王五'],'班级': ['1班', '1班', '1班','2班'],'分数': [40,50,60,70]}) print(data2) print('==='*20) data3= pd.merge(data1,data2,on=['姓名','班级']) # 内连接(交集)的结果 print(data3) print('==='*20) data4= pd.merge(data1,data2,on=['姓名','班级'],how='outer') # 外连接(并集)的结果 print(data4)
运行结果为:
姓名 班级 分数 0 张三 1班 10 1 张三 2班 20 2 王五 1班 30 ============================================================ 姓名 班级 分数 0 张三 1班 40 1 张三 1班 50 2 王五 1班 60 3 王五 2班 70 ============================================================ 姓名 班级 分数_x 分数_y 0 张三 1班 10 40 1 张三 1班 10 50 2 王五 1班 30 60 ============================================================ 姓名 班级 分数_x 分数_y 0 张三 1班 10.0 40.0 1 张三 1班 10.0 50.0 2 张三 2班 20.0 NaN 3 王五 1班 30.0 60.0 4 王五 2班 NaN 70.0
5.1.6 Merge on Index (基于index上的merge)
我们还可以实现几个Dataframe基于Index的merge,还是老样子,先让我们创建两个Dataframe
import pandas as pd data1 = pd.DataFrame({'姓名': ['张三','李四','王五','张三','李四'],'次数':range(5)}) data2 = pd.DataFrame({'数据': [10, 20]}, index=['张三','李四']) data3=pd.merge(data1,data2,left_on='姓名',right_index=True) print(data3) print('==='*20) data4=pd.merge(data1,data2,left_on='姓名',right_index=True,how='outer') print(data4)
运行结果为:
姓名 次数 数据 0 张三 0 10 3 张三 3 10 1 李四 1 20 4 李四 4 20 ============================================================ 姓名 次数 数据 0 张三 0 10.0 3 张三 3 10.0 1 李四 1 20.0 4 李四 4 20.0 2 王五 2 NaN
5.1.7 总结
(1)通过on指定数据合并对齐的列
result = pd.merge(left, right, on=[‘key1’, ‘key2’])
(2)没有指定how的话默认使用inner方法,除了内连接,还包括左连接、右连接、全外连接
左连接:
result = pd.merge(left, right, how=‘left’, on=[‘key1’, ‘key2’])
右连接:
result = pd.merge(left, right, how=‘right’, on=[‘key1’, ‘key2’])
全外连接:
result = pd.merge(left, right, how=‘outer’, on=[‘key1’, ‘key2’])
5.2 Join
案例:
import pandas as pd left_dict={'姓名1':['叶问','李小龙','落空空'],'年龄1':[127,80,20]} right_dict={'姓名2':['大刀王五','霍元甲','陈真'],'年龄2':[176,152,128]} left = pd.DataFrame(left_dict) right = pd.DataFrame(right_dict) print(left.join(right))
运行结果为:
姓名1 年龄1 姓名2 年龄2 0 叶问 127 大刀王五 176 1 李小龙 80 霍元甲 152 2 落空空 20 陈真 128
其实通过这一个小例子大家也就明白了,join无非就是合并,默认是横向,还有一个点需要注意的是,我们其实可以通过join实现和merge一样的效果,但是为了
避免混淆,我不会多举其他的例子了,因为我个人认为一般情况下还是用merge函数好一些
join方法将两个DataFrame中不同的列索引合并成为一个DataFrame参数的意义与merge基本相同,只是join方法默认左外连接how=left
def join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):
(1)on参数
result = left.join(right, on=‘key’)
(3)组合多个dataframe
一次组合多个dataframe的时候可以传入元素为dataframe的列表或者tuple。一次join多个,一次解决多次烦恼~
right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2']) result = left.join([right, right2])
5.3 Concat
import numpy as np arr = np.arange(9).reshape((3,3)) print(arr) arr1 = np.concatenate([arr,arr],axis=1) print(arr1) arr2 = np.concatenate([arr,arr],axis=0) print(arr2)
运行结果为:
[[0 1 2] [3 4 5] [6 7 8]] [[0 1 2 0 1 2] [3 4 5 3 4 5] [6 7 8 6 7 8]] [[0 1 2] [3 4 5] [6 7 8] [0 1 2] [3 4 5] [6 7 8]]
concat语法
concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
5.3.1 在Pandas中使用Concat
案例:
import pandas as pd data1 = pd.Series([0,1,2],index=['A','B','C']) data2 = pd.Series([3,4],index=['D','E']) data3 = pd.concat([data1,data2]) print(data3)
运行结果为:
A 0 B 1 C 2 D 3 E 4 dtype: int64
在上面的例子中,我们分别创建了两个没有重复Index的Series,然后用concat默认的把它们合并在一起,这时生成的依然是Series类型,如果我们把axis换成1,那生成
的就是Dataframe,像下面一样
data4 = pd.concat([data1,data2],axis=1,sort =True) # sort=Ture是默认的,pandas总是默认index排序,默认axis=0 print(data4)
运行结果为:
0 1 A 0.0 NaN B 1.0 NaN C 2.0 NaN D NaN 3.0 E NaN 4.0
5.3.2 首尾相接
frames = [df1, df2, df3] result = pd.concat(frames)
要在相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数
result = pd.concat(frames, keys=['x', 'y', 'z'])
5.3.3 横向表拼接(行对齐)
(1)axis
当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并
result = pd.concat([df1, df4], axis=1)
(2)join
加上join参数的属性,如果为’inner’得到的是两表的交集,如果是
outer,得到的是两表的并集。
result = pd.concat([df1, df4], axis=1, join='inner')
(3)join_axes
如果有join_axes的参数传入,可以指定根据那个轴来对齐数据
例如根据df1表对齐数据,就会保留指定的df1表的轴,然后将df4的表与之
拼接
result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])
5.3.4 append
append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)
result = df1.append(df2)
5.3.5 无视index的concat
如果两个表的index都没有实际含义,使用ignore_index参数,置true,合并的两个表就是根据列字段对齐,然后合并。最后再重新整理一个新的index。
5.3.6 合并的同时增加区分数据组的键
前面提到的keys参数可以用来给合并后的表增加key来区分不同的表数据来源
(1)可以直接用key参数实现
result = pd.concat(frames, keys=['x', 'y', 'z'])
(2)传入字典来增加分组键
pieces = {'x': df1, 'y': df2, 'z': df3} result = pd.concat(pieces)
5.3.7 在dataframe中加入新的行
append方法可以将 series 和 字典就够的数据作为dataframe的新一行插入。
s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D']) result = df1.append(s2, ignore_index=True)
5.3.8 表格列字段不同的表合并
如果遇到两张表的列字段本来就不一样,但又想将两个表合并,其中无效的值用nan来表示。那么可以使用ignore_index来实现。
dicts = [{'A': 1, 'B': 2, 'C': 3, 'X': 4}, {'A': 5, 'B': 6, 'C': 7, 'Y': 8}] result = df1.append(dicts, ignore_index=True)
六. 填充常用类型数据
pd.read_excel参数:
skiprows=行数 #跳过几行 usecols="区域" # 和Excel中一样,就是一个列的区域 index_col="字段名" # 将谁设置为索引 dtype={'序号':str,'性别':str,'日期':str} # 防止出错,把类型全指定为字符型
数据.at的用法
作用:获取某个位置的值,例如,获取第0行,第a列的值,即:index=0,columns=‘a’
变量名 = 数据.at[0, 'a']
日期模块 datetime
import pandas as pd import datetime as dt def add_month(date, month): year = month // 12 mon = date.month + month % 12 if mon != 12: year = year + mon // 12 mon = mon % 12 return dt.date(date.year + year, mon, date.day) path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件010\自动填充.xlsx' data = pd.read_excel(path, skiprows=8, usecols='F:I', dtype={'序号': str, '性别': str, '日期': str}) start_date = dt.date(2021, 7, 27) for i in data.index: data['序号'].at[i] = i + 1 data['性别'].at[i] = '男' if i % 2 == 0 else '女' # data['日期'].at[i] = start_date + dt.timedelta(days=i) data['日期'].at[i] = dt.date(start_date.year + i, start_date.month, start_date.day) data['日期'].at[i] = add_month(start_date, i) data.set_index('序号',inplace=True) # data.to_excel(path) print(data)
运行结果为:
姓名 性别 日期 序号 1 张三 男 2021-07-27 2 李四 女 2021-08-27 3 王五 男 2021-09-27
6.1 填充数字
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件010\自动填充.xlsx' data = pd.read_excel(path) print(data)
这样做不行,因为所有的空行和空列会被显示为Nan
skiprows 从文件开始处,需要跳过的行数或行号列表
如下图,跳过前8行
下图为选择列
6.2 填充字符
遇到填充时,这里都指定为str类型,因为他不支持int等类型
6.3 填充日期
如果只想累加年份,用Date
timedelta只能加天,小时,秒,毫秒
但是月的累计很麻烦,因为累加到12月就要进1位到年份上
这个时候,设置索引不能在read_excel中完成,因为我们在填充时用到他的自动索引,需要用另一个方法设置索引
数据.set_index(‘序号’,inplace=True) # 只在index上面改,不要生成新的
数据.to_excel(路径) # 写入Excel文件
6.4 在CSV中完成自动填充
七. 计算列
案例 :
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件011\计算列.xlsx' data = pd.read_excel(path,index_col='序号') data['销售金额']=data['单价']*data['销售数量'] print(data)
运行结果为:
商品名称 单价 销售数量 销售金额 序号 1 香蕉 5 20 100 2 苹果 6 15 90 3 梨 3 18 54
当你不想全部都计算,只想计算一部分行的时候,需要使用For循环
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件011\计算列.csv' data = pd.read_csv(path,index_col='序号') for i in range(1,3): data['销售金额'].at[i] = data['单价'].at[i] * data['销售数量'].at[i] print(data)
运行结果为:
商品名称 单价 销售数量 销售金额 序号 1 香蕉 5 20 100.0 2 苹果 6 15 90.0 3 梨 3 18 NaN
7.1 pandas apply() 函数
理解 pandas 的函数,要对函数式编程有一定的概念和理解。函数式编程,包括函数式编程思维,当然是一个很复杂的话题,但对今天介绍的 apply()
函数,只需要理解:函数作为一个对象,能作为参数传递给其它参数,并且能作为函数的返回值。
pandas 的 apply()
函数可以作用于 Series 或者整个 DataFrame,功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数
Series.apply()
:民族为少数民族的加5分
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件011\apply函数.xlsx' data = pd.read_excel(path,index_col='序号') data['加分']=data['民族'].apply(lambda x:5 if x != '汉' else 0) data['最终分数'] = data['总分']+data['加分'] print(data)
运行结果为:
姓名 民族 总分 加分 最终分数 序号 1 张三 汉 591 0 591 2 李四 满 589 5 594 3 王五 回 587 5 592
apply() 函数当然也可执行 python 内置的函数,比如我们想得到 Name 这一列字符的个数,如果用 apply() 的话:
data['姓名字符个数']=data['姓名'].apply(len) print(data)
运行结果为:
姓名 民族 总分 加分 最终分数 姓名字符个数 序号 1 张三 汉 591 0 591 2 2 李四 满 589 5 594 2 3 王五 回 587 5 592 2
DataFrame.apply()
函数则会遍历每一个元素,对元素运行指定的 function。比如下面的示例:计算数组的平方根
import pandas as pd import numpy as np arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] data = pd.DataFrame(arr, columns=['x', 'y', 'z'], index=['a', 'b', 'c']) print(data.apply(np.square))
运行结果为:
x y z a 1 4 9 b 16 25 36 c 49 64 81
如果只想 apply() 作用于指定的行和列,可以用行或者列的 name 属性进行限定。比如下面的示例将 x 列进行平方运算:
data2 = data.apply(lambda a : np.square(a) if a.name=='x' else a) print(data2)
运行结果为:
x y z a 1 2 3 b 16 5 6 c 49 8 9
对 x 和 y 列进行平方运算:
data3 = data.apply(lambda a : np.square(a) if a.name in ['x','y'] else a) print(data3)
运行结果为:
x y z a 1 4 3 b 16 25 6 c 49 64 9
第一行 (a 标签所在行)进行平方运算:
data4 = data.apply(lambda m : np.square(m) if m.name == 'a' else m, axis=1) print(data4)
运行结果为:
x y z a 1 4 9 b 4 5 6 c 7 8 9
第一行和第三行(a标签和c标签所在行)进行平方运算
data5 = data.apply(lambda m : np.square(m) if m.name in ['a','c'] else m, axis=1) print(data5)
运行结果为:
x y z a 1 4 9 b 4 5 6 c 49 64 81
7.2 apply函数计算日期相减
平时我们会经常用到日期的计算,比如要计算两个日期的间隔,比如下面的一组关于起止日期的数据:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件011\计算日期.xlsx' data=pd.read_excel(path,index_col='序号') data['间隔']=data['结束日期']-data['起始日期'] print(data)
运行结果为:
起始日期 结束日期 间隔 序号 1 2020-01-01 2020-01-08 7 days 2 2020-03-01 2020-09-07 190 days 3 2020-05-03 2020-08-08 97 days 4 2020-04-08 2020-11-08 214 days 5 2020-07-30 2021-09-03 400 days
八. 排序
格式:
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
参数说明
axis:如果axis=0,那么by=“列名”;如果axis=1,那么by=“行号”;
ascending:True则升序,可以是[True,False],即第一字段升序,第二个降序
inplace=True:不创建新的对象,直接对原始对象进行修改;
inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果。
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心
na_position : {‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面
数据如下:
例1:按语文分数降序排列
import pandas as pd path = 'E:\Desktop\科学计算\Pandas课件\pandas教程\课件012\排序.xlsx' data = pd.read_excel(path,index_col='序号') data.sort_values(by='语文',inplace=True,ascending=False) print(data)
运行结果为:
姓名 语文 数学 英语 序号 4 张伊 69 44 58 1 卢海军 64 49 49 2 丁智敏 61 61 60 3 李平平 58 49 33 6 王松 47 44 62 5 王刚 37 63 42
例2:按语文分数排序降序,数学升序,英语降序
import pandas as pd path = 'E:\Desktop\科学计算\Pandas课件\pandas教程\课件012\排序.xlsx' data = pd.read_excel(path,index_col='序号') data.sort_values(by=['语文','数学','英语'],inplace=True,ascending=[False,True,False]) print(data)
运行结果为:
姓名 语文 数学 英语 序号 4 张伊 69 44 58 1 卢海军 64 49 49 2 丁智敏 61 61 60 3 李平平 58 49 33 6 王松 47 44 62 5 王刚 37 63 42
例3:按索引进行排序
import pandas as pd path = 'E:\Desktop\科学计算\Pandas课件\pandas教程\课件012\排序.xlsx' data = pd.read_excel(path,index_col='序号') data.sort_index(inplace=True) print(data)
运行结果为:
姓名 语文 数学 英语 序号 1 卢海军 64 49 49 2 丁智敏 61 61 60 3 李平平 58 49 33 4 张伊 69 44 58 5 王刚 37 63 42 6 王松 47 44 62
进阶排序篇:
数据如下:
按a列降序排序
import pandas as pd path = 'E:\Desktop\科学计算\Pandas课件\pandas教程\课件012\排序进阶.xlsx' data = pd.read_excel(path) data.sort_values(by='a',inplace=True,ascending=False) print(data)
运行结果为:
a b c 3 8 7 9 1 6 4 2 0 3 5 6 2 2 3 1
按 2 行降序排序
import pandas as pd path = 'E:\Desktop\科学计算\Pandas课件\pandas教程\课件012\排序进阶.xlsx' data = pd.read_excel(path) data.sort_values(by=1,inplace=True,ascending=False,axis=1) print(data)
运行结果为:
a b c 0 3 5 6 1 6 4 2 2 2 3 1 3 8 7 9
九. 查询数据 【loc】
注意:如果查询的数据里面牵扯到日期
的查询,那么一定要把日期指定为索引再去查
首先先将日期作为索引看一下数据:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期') print(data)
运行结果为:
序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座 1994-01-07 3 李平平 女 58 49 33 140 襄阳市某某区某某小区c座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座
9.1 单条件查询
语法:loc[行标签,列标签]
查看 1983-10-27 的语文成绩
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期') print(data.loc['1983-10-27','语文'])
运行结果为:
出生日期 1983-10-27 61 Name: 语文, dtype: int64
9.2 多条件查询
查看 1983-10-27的 语文 数学 英语成绩
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期') print(data.loc['1983-10-27',['语文','数学','英语']])
运行结果为:
语文 数学 英语 出生日期 1983-10-27 61 61 60
9.3 使用数据区间范围进行查询
查看1983-10-27 到 1990-12-31的语文 数学 英语成绩
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期') print(data.loc['1983-10-27':'1990-12-31',['语文','数学','英语']])
运行结果为:
语文 数学 英语 出生日期 1983-10-27 61 61 60 1987-02-06 69 44 58 1989-07-08 37 63 42 1987-03-06 47 44 62
9.4 使用条件表达式进行查询
查询 语文成绩大于60 英语成绩小于60的信息
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期') print(data.loc[(data['语文'] > 60) & (data['英语'] < 60),:])
这里的 ,: 指的是列取全部
运行结果为:
序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座
9.5 loc实现条件判断
添加称呼列,将 男性 赋值为 先生 ,女性 赋值为 女士
import pandas as pd import datetime as dt path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\条件判断.xlsx' data = pd.read_excel(path,index_col='序号') data.loc[data['性别'] == "男","称呼"] = "先生" data.loc[data['性别'] == "女","称呼"] = "女士" print(data)
运行结果为:
姓名 性别 语文 数学 英语 称呼 序号 1 张三 男 89 60 88 先生 2 李四 女 60 71 98 女士 3 王五 男 73 84 68 先生 4 小孙 男 85 96 96 先生 5 小刘 女 70 63 97 女士 6 小赵 女 63 63 91 女士
十. 筛选
1.加载数据
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') print(data)
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 1 卢海军 男 1983-01-05 64 49 49 162 上海市某某区某某小区A座 2 丁智敏 女 1983-10-27 61 61 60 182 冀州市某某区某某小区a座 3 李平平 女 1994-01-07 58 49 33 140 襄阳市某某区某某小区c座 4 张伊 女 1987-02-06 69 44 58 171 河南省信阳市某某区某某小区C座 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
2.按位置筛选,筛选第2行至第4行数据
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') data2=data.loc[2:4] print(data2)
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 2 丁智敏 女 1983-10-27 61 61 60 182 冀州市某某区某某小区a座 3 李平平 女 1994-01-07 58 49 33 140 襄阳市某某区某某小区c座 4 张伊 女 1987-02-06 69 44 58 171 河南省信阳市某某区某某小区C座
3.按值过滤,筛选所有男性
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose = data['性别'] == '男' print(data[choose])
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 1 卢海军 男 1983-01-05 64 49 49 162 上海市某某区某某小区A座 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
4.多条件筛选,男性和总分大于等于150
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose = "性别 == '男' and 总分 >= 150" print(data.query(choose))
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 1 卢海军 男 1983-01-05 64 49 49 162 上海市某某区某某小区A座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
query 方法,可以直接接受一个查询字符串,是不是很像 Sql 呢.指定多个值也很简单,使用in 或not in,如下:
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose="姓名 in['王松','王刚']" print(data.query(choose))
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
10.1 文本筛选:开头与结尾
startswith( ) endwith( )
startswith()
函数
描述:判断字符串是否以指定字符或子字符串开头。
语法:str.endswith(“suffix”, start, end) 或 str[start,end].endswith(“suffix”) 用于判断字符串中某段字符串是否以指定字符或子字符串结尾。
—> bool 返回值为布尔类型(True,False)
suffix — 后缀,可以是单个字符,也可以是字符串,还可以是元组("suffix"中的引号要省略)。
start
—索引字符串的起始位置。
end
— 索引字符串的结束位置。
str.endswith(suffix)
star默认为0,end默认为字符串的长度减一(len(str)-1)
注意:空字符的情况。返回值通常也为True
例:姓名列开头姓王的
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose = data['姓名'].str.startswith('王') # 如果是结尾,就改成endwith print(data[choose])
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
10.2 文本筛选:包含
str.contains(pat, case=True, flags=0, na=nan, regex=True)#是否包含查找的字符串
参数:
pat : 字符串/正则表达式
case : 布尔值, 默认为True.如果为True则匹配敏感
flags : 整型,默认为0(没有flags)
na : 默认为NaN,替换缺失值.
regex : 布尔值, 默认为True.如果为真则使用re.research,否则使用Python
返回值:
布尔值的序列(series)或数组(array)
例1:筛选地址包含信阳市
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose = data['地址'].str.contains('信阳市') print(data[choose])
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 4 张伊 女 1987-02-06 69 44 58 171 河南省信阳市某某区某某小区C座 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座
10.3 筛选值范围
例1:语文分数在60至100之间的女性
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='序号',sheet_name='Sheet1') choose = " 60 <= 语文 <= 100 and 性别 == '女'" print(data.query(choose))
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 2 丁智敏 女 1983-10-27 61 61 60 182 冀州市某某区某某小区a座 4 张伊 女 1987-02-06 69 44 58 171 河南省信阳市某某区某某小区C座
10.4 筛选日期
10.4.1 获取某年某月数据
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期',parse_dates=['出生日期']) print(data['1989'].head()) print(data['1983-10'].head())
运行结果为:
序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座
10.4.2 获取某个时期之前或之后的数据
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path,index_col='出生日期',parse_dates=['出生日期']) data2 = data.sort_values('出生日期') # 获取某个时期之前或之后的数据 # 获取1980年以后的数据 print(data2.truncate(before='1980').head()) print('==='*20) # 获取1990-12之前的数据 print(data2.truncate(after='1990-12').head()) print('==='*20) # 获取1990-02年以后的数据 print(data2.truncate(before='1990-02').head()) print('==='*20) # 获取1984-01-01年以后的数据 print(data2.truncate(before='1984-01-1').head()) print('==='*20) # 获取指定时间区间 print(data2['1983':'1990']) print(data2['1983-01-1':'1990-12-31'])
运行结果为:
序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 ============================================================ 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 ============================================================ 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1994-01-07 3 李平平 女 58 49 33 140 襄阳市某某区某某小区c座 ============================================================ 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 1994-01-07 3 李平平 女 58 49 33 140 襄阳市某某区某某小区c座 ============================================================ 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座 序号 姓名 性别 语文 数学 英语 总分 地址 出生日期 1983-01-05 1 卢海军 男 64 49 49 162 上海市某某区某某小区A座 1983-10-27 2 丁智敏 女 61 61 60 182 冀州市某某区某某小区a座 1987-02-06 4 张伊 女 69 44 58 171 河南省信阳市某某区某某小区C座 1987-03-06 6 王松 男 47 44 62 153 襄阳市某某区某某小区F座 1989-07-08 5 王刚 男 37 63 42 142 信阳市某某区某某小区B座
10.4.3 【推荐】多条件日期范围
import pandas as pd path = r'E:\Desktop\科学计算\Pandas课件\pandas教程\课件013-014\筛选.xlsx' data = pd.read_excel(path, index_col='序号', parse_dates=['出生日期']) choose = ( '@data.出生日期.dt.year > 1980 and' '@data.出生日期.dt.year < 1990' 'and 性别 == "男"' ) print(data.query(choose))
运行结果为:
姓名 性别 出生日期 语文 数学 英语 总分 地址 序号 1 卢海军 男 1983-01-05 64 49 49 162 上海市某某区某某小区A座 5 王刚 男 1989-07-08 37 63 42 142 信阳市某某区某某小区B座 6 王松 男 1987-03-06 47 44 62 153 襄阳市某某区某某小区F座
这篇关于Python全栈开发-数据分析-02 Pandas详解 (上)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门