Python全栈开发-数据分析-02 Pandas详解 (上)

Pandas详解 (上)

一. 安装pandas

1.按Win+R,输入CMD确定,
Python全栈开发-数据分析-02 Pandas详解 (上)_第1张图片
输入 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表格,内容与其一致
Python全栈开发-数据分析-02 Pandas详解 (上)_第2张图片

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

Python全栈开发-数据分析-02 Pandas详解 (上)_第3张图片

注意:你的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

Python全栈开发-数据分析-02 Pandas详解 (上)_第4张图片

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的数透)

五. 连接查询

Python全栈开发-数据分析-02 Pandas详解 (上)_第5张图片
Python全栈开发-数据分析-02 Pandas详解 (上)_第6张图片
Python全栈开发-数据分析-02 Pandas详解 (上)_第7张图片

5.1 Merge

首先merge的操作非常类似sql里面的join,实现将两个Dataframe根据一些共有的列连接起来,当然,在实际场景中,这些共有列一般是Id,
连接方式也丰富多样,可以选择inner(默认),left,right,outer 这几种模式,分别对应的是内连接,左连接,右连接,全外连接
Python全栈开发-数据分析-02 Pandas详解 (上)_第8张图片

5.1.1 InnerMerge (内连接)

内连接的参数onhow可以省略

数据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  张三  110
1  张三  220
2  王五  130
============================================================
   姓名  班级  分数
0  张三  140
1  张三  150
2  王五  160
3  王五  270
============================================================
   姓名  班级  分数_x  分数_y
0  张三  110    40
1  张三  110    50
2  王五  130    60
============================================================
   姓名  班级  分数_x  分数_y
0  张三  110.0  40.0
1  张三  110.0  50.0
2  张三  220.0   NaN
3  王五  130.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指定数据合并对齐的列
Python全栈开发-数据分析-02 Pandas详解 (上)_第9张图片
result = pd.merge(left, right, on=[‘key1’, ‘key2’])

(2)没有指定how的话默认使用inner方法,除了内连接,还包括左连接、右连接、全外连接

左连接:
result = pd.merge(left, right, how=‘left’, on=[‘key1’, ‘key2’])
Python全栈开发-数据分析-02 Pandas详解 (上)_第10张图片
右连接:
result = pd.merge(left, right, how=‘right’, on=[‘key1’, ‘key2’])
Python全栈开发-数据分析-02 Pandas详解 (上)_第11张图片
全外连接:
result = pd.merge(left, right, how=‘outer’, on=[‘key1’, ‘key2’])
Python全栈开发-数据分析-02 Pandas详解 (上)_第12张图片

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’)
Python全栈开发-数据分析-02 Pandas详解 (上)_第13张图片
(3)组合多个dataframe
一次组合多个dataframe的时候可以传入元素为dataframe的列表或者tuple。一次join多个,一次解决多次烦恼~

right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2'])
result = left.join([right, right2])

Python全栈开发-数据分析-02 Pandas详解 (上)_第14张图片

5.3 Concat

Python全栈开发-数据分析-02 Pandas详解 (上)_第15张图片

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)

Python全栈开发-数据分析-02 Pandas详解 (上)_第16张图片

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)

Python全栈开发-数据分析-02 Pandas详解 (上)_第17张图片

要在相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数

result = pd.concat(frames, keys=['x', 'y', 'z'])

Python全栈开发-数据分析-02 Pandas详解 (上)_第18张图片

5.3.3 横向表拼接(行对齐)

(1)axis
当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并

result = pd.concat([df1, df4], axis=1)

Python全栈开发-数据分析-02 Pandas详解 (上)_第19张图片
(2)join
加上join参数的属性,如果为’inner’得到的是两表的交集,如果是
outer,得到的是两表的并集。

result = pd.concat([df1, df4], axis=1, join='inner')

Python全栈开发-数据分析-02 Pandas详解 (上)_第20张图片
(3)join_axes
如果有join_axes的参数传入,可以指定根据那个轴来对齐数据
例如根据df1表对齐数据,就会保留指定的df1表的轴,然后将df4的表与之
拼接

result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

Python全栈开发-数据分析-02 Pandas详解 (上)_第21张图片

5.3.4 append

append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)

result = df1.append(df2)

Python全栈开发-数据分析-02 Pandas详解 (上)_第22张图片

5.3.5 无视index的concat

如果两个表的index都没有实际含义,使用ignore_index参数,置true,合并的两个表就是根据列字段对齐,然后合并。最后再重新整理一个新的index。
Python全栈开发-数据分析-02 Pandas详解 (上)_第23张图片

5.3.6 合并的同时增加区分数据组的键

前面提到的keys参数可以用来给合并后的表增加key来区分不同的表数据来源
(1)可以直接用key参数实现

result = pd.concat(frames, keys=['x', 'y', 'z'])

Python全栈开发-数据分析-02 Pandas详解 (上)_第24张图片
(2)传入字典来增加分组键

pieces = {'x': df1, 'y': df2, 'z': df3}
result = pd.concat(pieces)

Python全栈开发-数据分析-02 Pandas详解 (上)_第25张图片

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)

Python全栈开发-数据分析-02 Pandas详解 (上)_第26张图片

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)

Python全栈开发-数据分析-02 Pandas详解 (上)_第27张图片

六. 填充常用类型数据

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行
Python全栈开发-数据分析-02 Pandas详解 (上)_第28张图片
下图为选择列
Python全栈开发-数据分析-02 Pandas详解 (上)_第29张图片

6.2 填充字符

遇到填充时,这里都指定为str类型,因为他不支持int等类型
Python全栈开发-数据分析-02 Pandas详解 (上)_第30张图片

6.3 填充日期

Python全栈开发-数据分析-02 Pandas详解 (上)_第31张图片
如果只想累加年份,用Date
Python全栈开发-数据分析-02 Pandas详解 (上)_第32张图片
timedelta只能加天,小时,秒,毫秒
但是月的累计很麻烦,因为累加到12月就要进1位到年份上
Python全栈开发-数据分析-02 Pandas详解 (上)_第33张图片
这个时候,设置索引不能在read_excel中完成,因为我们在填充时用到他的自动索引,需要用另一个方法设置索引

数据.set_index(‘序号’,inplace=True) # 只在index上面改,不要生成新的
数据.to_excel(路径) # 写入Excel文件

6.4 在CSV中完成自动填充

Python全栈开发-数据分析-02 Pandas详解 (上)_第34张图片

七. 计算列

案例 :

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
33    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
33    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函数计算日期相减

平时我们会经常用到日期的计算,比如要计算两个日期的间隔,比如下面的一组关于起止日期的数据:
Python全栈开发-数据分析-02 Pandas详解 (上)_第35张图片

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’,默认缺失值排在最后面

数据如下:
Python全栈开发-数据分析-02 Pandas详解 (上)_第36张图片
例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

进阶排序篇:
数据如下:
Python全栈开发-数据分析-02 Pandas详解 (上)_第37张图片
按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座

你可能感兴趣的:(pandas,python,python,pandas,数据分析)