Python学习篇31-Pandas数据分析库

Pandas 数据分析库

Pandas 是基于 Numpy 的一套数据分析工具,该工具是为了解决数据分析任务而创建的。 Pandas 纳入了大量标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas 提 供了大量能使我们快速便捷地处理数据的函数和方法。它是使 Python 成为强大而高效的数 据分析环境的重要因素之一。

通过阅读本章,您可以:

  • 掌握 Anaconda 环境的安装及使用
  • 了解什么是 Pandas
  • 掌握 Series 对象基本操作
  • 掌握 DataFrame 对象的基本操作
  • 掌握缺值处理
  • 掌握 Series 对象和 DataFrame 的拼接
  • 掌握 merge 的使用

22.1Pandas 开发环境搭建

Pandas 是第三方程序库,所以在使用 Pandas 之前必须安装 Pandas 库。但是如果使用 Anaconda Python 开发环境,那么 Pandas 已经集成到 Anaconda 环境中,不需要再安装。

22.1.1Anaconda 下载和安装

Anaconda 已经自动的安装了 Jupter Notebook 及其他工具,还有 python 中超过 180 个科 学包及其依赖项。现在就看一下 Anaconda 的具体安装流程。

  1. 进入官网(https://www.anaconda.com/products/individual),单击 Download 按钮,如图 22-1 所示。

在这里插入图片描述

​ 图 22-1Anaconda 官网

  1. 根据电脑系统类型及 Python 环境下载对应版本,因为在 2020 年之后官方就不再支持 Python2 了,所以建议大家选择 Python3,本书的代码也是基于 Python3,然后根据电脑 的操作系统位数(32Bit/64Bit)选择对应版本,如图 22-2 所示。
    在这里插入图片描述

​ 图 22-2Anaconda 下载

  1. 下载后保存到电脑里,双击安装包打开后进行安装,如图 22-3、22-4、22-5 依次单击相 应按钮。
    在这里插入图片描述

​ 图 22-3 双击安装文件
在这里插入图片描述

​ 图 22-4 同意协议
在这里插入图片描述

​ 图 22-5 选择用户

  1. 选择安装路径,不需要添加环境变量,然后点击 Next 按钮,并在弹出的对话框中勾选 相应选项即可。
    在这里插入图片描述

​ 图 22-6 选择安装路径

在这里插入图片描述

​ 图 22-7 不添加环境变量

在这里插入图片描述

​ 图 22-8 安装成功

  1. 单击并勾选如图 22-9、22-10 所示按钮。

在这里插入图片描述

​ 图 22-9 跳过

在这里插入图片描述

​ 图 22-10 安装完成

  1. 完成上述操作后,开始界面就会看到如图 22-11 所示新添加的程序,这就表示 Anoconda 安装好了。单击 Jupyter Notebook 打开,会弹出一个黑框,按 Enter 键后会让你选择哪 个浏览器打开,建议选择 Chrome 浏览器。

在这里插入图片描述

​ 图 22-11 开始界面新增程序

  1. 当看到如图 22-12 所示界面时,表示环境已经配置好了。

在这里插入图片描述

​ 图 22-12 启动 Jupyter Notebook 界面

  1. 新建 Jupyter Notebook 文件

打开 Jupyter Notebook 后单击右上角的 New 按钮,在下拉列表中选择 Python3 选项来创 建一个 Python 文件,如图 22-13 所示。

在这里插入图片描述

​ 图 22-13 新建 Jupyter Notebook 文件

当你看到如图 22-14 所示的界面就表示新建了一个 Jupyter Notebook 文件。

在这里插入图片描述

​ 图 22-14 Jupyter Notebook 文件

  1. 运行第一段代码

在图 22-14 的代码框中输入 print(“hello Python”),然后单击 Run 按钮,或者按 Ctrl+Enter 组合键,就会输出 hello Python,这就表示你的第一段代码运行成功。当你想换一个代码框 输入代码时,你可以通过单击左上角的“+”按钮来新增代码框。执行效果如图 22-15 所示。

在这里插入图片描述

​ 图 22-15 运行第一段代码

  1. 重命名 Jupyter Notebook 文件

当新建一个 Jupyter Notebook 文件时,该文件名默认为 Untitled(类似于 Excel 中的工作 簿),可以单击 File→Rename 对该文件进行重命名,如图 22-16 所示。

在这里插入图片描述

​ 图 22-16 重命名 Jupyter Notebook 文件

  1. 保存 Jupyter Notebook 文件

保存文件有两种方式:

  • 单击 File→Save and Checkpoint 保存文件,但是这种方法会将文件保存到默认路径下, 且文件默认格式为 ipynb,ipynb 是 Jupyter Notebook 的专属文件格式。
  • 选择 Download as 选项对文件进行保存,它相当于 Excel 中的“另存为”,可以自己选 择保存路径及保存格式,如图 22-17 所示。

在这里插入图片描述

​ 图 22-17 保存 Jupyter Notebook 文件

  1. Pandas 数据类型

Pandas 中两个重要的数据类型:Series 和 DataFrame。Series 表示数据列表,DataFrame 表示二维数据集。

  1. Series 对象创建

【示例 22-1】使用列表创建 Series 对象

import pandas as pd

data=pd.Series([4,3,5,6,1])

data

运行结果如图 22-18 所示:

在这里插入图片描述

​ 图 22-18 示例 22-1 运行效果图

series 对象包装的是 numpy 中的一维数组,实际上是将一个一维数组与一个索引名称捆 绑在一起了。

pandas 中两个重要的属性 values 和 index,values 是 Series 对象的原始数据。index 对 应了 Series 对象的索引对象。

【示例 22-2Series 对象中两个重要的属性 valuesindex

data.values

data.index

运行结果如图 22-19 所示:
在这里插入图片描述

​ 图 22-19 示例 22-2 运行效果图

【示例 22-3】创建 Series 对象时候,指定 index 属性

data=pd.Series([5,4,6,3,1],index=[‘one’,‘two’,‘three’,‘four’,‘five’])

data

运行结果如图 22-20 所示:
在这里插入图片描述

​ 图 22-20 示例 22-3 运行效果图

【示例 22-4】创建 Series 对象时候,使用 list 列表指定 index 属性

data=pd.Series([4,3,2,1],index=list(‘abcd’)) data

运行结果如图 22-21 所示:
在这里插入图片描述

​ 图 22-21 示例 22-4 运行效果图

【示例 22-5】使用字典创建 Series 对象,默认将 key 作为 index 属性 population_dict={‘bj’:3000,‘gz’:1500,‘sh’:2800,‘sz’:1200}

population_series=pd.Series(population_dict) population_series

运行结果如图 22-22 所示:
在这里插入图片描述

​ 图 22-22 示例 22-5 运行效果图

【示例 22-6】使用字典创建 Series 对象,又指定了 index 属性值,如果 key 不存在,则值 为 NaN

sub_series=pd.Series(population_dict,index=['bj','sh']) #如果存在取交集 
sub_series
sub_series=pd.Series(population_dict,index=['bj','xa']) #如果不存在则值为 NaN sub_series

运行结果如图 22-23 所示:

在这里插入图片描述

​ 图 22-23 示例 22-6 运行效果图

【示例 22-7】标量与 index 属性创建 Series

data=pd.Series(10,index=[4,3,2,5])

data

运行结果如图 22-24 所示:

在这里插入图片描述

​ 图 22-24 示例 22-7 运行效果图

  1. DataFrame 对象创建

将两个 series 对象作为字典的值,就可以创建一个 DataFrame 对象。

【示例 22-8】创建 DataFrame 对象

population_dict={'beijing':3000,'shanghai':1200,'guangzhou':1800} 
area_dict={'beijing':300,'guangzhou':200,'shanghai':180}
import pandas as pd
population_series=pd.Series(population_dict) 
area_series=pd.Series(area_dict) citys=pd.DataFrame({'area':area_series,'population':population_series}) 
citys

运行结果如图 22-25 所示:
在这里插入图片描述

22-25 示例 22-8 运行效果图

【示例 22-9】查看 DataFrame 对象的 valuesindexcolumns 属性

citys.index

citys.values citys.columns

运行结果如图 22-26 所示:
在这里插入图片描述

​ 图 22-26 示例 22-9 运行效果图

【示例 22-10】使用列表创建 DataFrame 对象

population_dict={'beijing':3000,'shanghai':1200,'guangzhou':1800} 
area_dict={'beijing':300,'shanghai':180,'guangzhou':200} data=pd.DataFrame([population_dict,area_dict])
print(data) #将‘beijing’ ‘shanghai’ ‘guangzhou’作为表头 

运行结果如图 22-27 所示:
在这里插入图片描述

​ 图 22-27 示例 22-10 运行效果图

​ 【示例 22-11】创建 DataFrame 对象,指定 index 属性

population_dict={‘beijing’:3000,‘guangzhou’:1800,‘shanghai’:1200}

area_dict={‘beijing’:300,‘shanghai’:180,‘guangzhou’:200} data=pd.DataFrame([area_dict,population_dict],index=[‘area’,‘population’])

data

运行结果如图 22-28 所示:
在这里插入图片描述

​ 图 22-28 示例 22-11 运行效果图

【示例 22-12】创建 DataFrame 对象,指定列索引 columns

population_series=pd.Series(population_dict)

pd.DataFrame(population_series,columns=[‘population’])

运行结果如图 22-29 所示:
在这里插入图片描述

​ 图 22-29 示例 22-12 运行效果图

【示例 22-13】使用列表创建 Dataframe 对象

pd.DataFrame([{‘a’:i,‘b’:i*2} for i in range(3)])

运行结果如图 22-30 所示:
在这里插入图片描述

​ 图 22-30 示例 22-13 运行效果图

【示例 22-14】使用一个二维数组并指定 columnsindex 创建 DataFrame 对象

import numpy as np

pd.DataFrame(np.random.randint(0,10,(3,2)),columns=list(‘ab’),index=list(‘efg’))

运行结果如图 22-31 所示:
在这里插入图片描述

​ 图 22-31 示例 22-14 运行效果图

  1. 获取 Series 对象的值

【示例 22-15Series 对象的切片、索引

import numpy as np
import pandas as pd 

data=pd.Series([4,3,25,2,3],index=list('abcde')) 
display('根据 key 获取:',data['a']) 
display('切片获取:',data['a':'d']) 
display('索引获取:',data[1]) 
display('索引切片:',data[2:4])

运行结果如图 22-32 所示:
在这里插入图片描述

​ 图 22-32 示例 22-15 运行效果图

从示例 22-15 运行结果如图 22-32 所示,可以看出 Series 与 ndarray 数组都可以通过索 引访问元素,Series 对象的索引分为位置索引和标签索引。不同之处,标签索引进行切片时 候是左闭右闭,而位置索引是左闭右开。

【示例 22-16】位置索引与标签索引相同的问题

data=pd.Series([5,6,7,8],index=[1,2,3,4])

data[1]

如示例 22-16 所示,位置索引与标签索引有相同值 1,这时候 data[1]就不知道是按哪个 来获取,此时要使用 loc、iloc。其中 loc 表示的是标签索引,iloc 表示的是位置索引。

【示例 22-17Series 对象中 lociloc 的使用

data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])

data.loc[1]

data.iloc[1]

运行结果如图 22-33 所示:
在这里插入图片描述

​ 图 22-33 示例 22-17 运行效果图

  1. 获取 DataFrame 的值
  1. 选择某一列**/**某几列

DataFrame 对象非常容易获取数据集中指定列的数据。只需要在表 df 后面的括号中指明 要选择的列名即可。如果要获取一列,则只需要传入一个列名;如果是同时选择多列,则传 入多个列名即可,多个列名用一个 list 存放。

【示例 22-18】创建 DataFrame 对象

import numpy as np![ref6]

import pandas as pd data=pd.DataFrame(np.arange(12).reshape(3,4),index=list(‘abc’),columns=list(‘ABCD’))

运行结果如图 22-34 所示:
在这里插入图片描述

​ 图 22-34 示例 22-18 运行效果图

【示例 22-19】获取 DataFrame 对象中某一列**/**某几列
print(‘获取‘B’列:’)
print(data[‘B’])
print(‘获取‘A’‘C’两列:’) print(data[[‘A’,‘C’]])
运行结果如图 22-35 所示:
在这里插入图片描述

​ 图 22-35 示例 22-19 运行效果图

DataFrame 对象获取列,除了传入具体的列名,还可以传入具体列的位置,通过传入位 置来获取数据时需要用到 iloc 方法。

【示例 22-20】通过传入位置获取 DataFrame 对象中某一列**/**某几列

print(‘获取第 1 列:’)

print(data.iloc[:,0])

print(‘获取第 1 列和第 3 列:’)

print(data.iloc[:,[0,2]])

运行结果如图 22-36 所示:
在这里插入图片描述

​ 图 22-36 示例 22-20 运行效果图

从上面的示例中可以看到,iloc 后的方括号中逗号之前的部分表示要获取的行的位置。 只输入一个冒号,不输入任何数值表示获取所有的行;逗号之后的方括号表示要获取的列的 位置,列的位置同样也是从 0 开始计数。

  1. 选择连续的某几列 我们将通过列名选择数据的方式叫做普通索引,传入列的位置选择数据的方式叫做位置 索引。获取连续的某几列,用普通索引和位置索引都可以做到。因为要获取的列是连续的, 所以直接对列进行切片。

【示例 22-21】获取 DataFrame 对象中连续几列

print('获取 B C D 三列,使用普通索引获取:') 
print(data.loc[:,'B':'D'])
print('获取 B C D 三列,使用位置索引获取:') 
print(data.iloc[:,1:4])

运行结果如图 22-37 所示:
在这里插入图片描述

​ 图 22-37 示例 22-21 运行效果图

从上面的示例可以看到,loc 和 iloc 后的方括号中逗号之前的表示选择的行,当只传入 一个冒号时,表示选择所有行,逗号后面表示要选择列。data.loc[:,‘B’:‘D’]表示选择从 B 列开 始到 D 列之间的值(包括 B 列也包括 D 列),data.iloc[:,1:4]表示选择第 2 列到第 5 列之间的 值(包括第 1 列但不包括第 5 列)。

  1. 选择某一行**/**某几行 获取行的方式主要有两种,一种是普通索引,即传入具体行索引的名称,需要用到 loc 方法;另外一种是位置索引,即传入具体的行数,需要用到 iloc 方法。

【示例 22-22DataFrame 对象中选择某一行**/**某几行

print('获取 a 行,普通索引获取:') 
print(data.loc['a'])
print('获取 a c 行,普通索引获取:') 
print(data.loc[['a','c']])
print('获取第 1 行,位置索引获取:') 
print(data.iloc[0])
print('获取第 1 行第 3 行,位置索引获取:') 
print(data.iloc[[0,2]])

运行结果如图 22-38 所示:
在这里插入图片描述

​ 图 22-38 示例 22-22 运行效果图

  1. 选择连续的某几行 选择连续的某几行和选择连续某几列类似,只要把连续行的位置用一个区间表示即可。

【示例 22-23DataFrame 对象中选择某一行**/**某几行

print(‘选择 a 行 b 行,使用普通索引:’) print(data.loc[‘a’:‘b’])

print(‘选择第 1 行 第 2 行,使用位置索引:’) print(data.iloc[0:2])

运行结果如图 22-39 所示:
在这里插入图片描述

​ 图 22-39 示例 22-23 运行效果图

  1. 行列同时选择

【示例 22-24】同时选择连续的部分行和部分列

print('同时获取 a b 行,AB 列,使用普通索引:') 
print(data.loc['a':'b','A':'B'])![ref7]
print('同时获取 a b 行,AB 列,使用位置索引:') 
print(data.iloc[0:2,0:2])

运行结果如图 22-40 所示:
在这里插入图片描述

22-40 示例 22-24 运行效果图

【示例 22-25】同时选择不连续的部分行和部分列

print('同时获取 a c 行,ABD 列,使用普通索引:') 
print(data.loc[['a','c'],['A','B','D']]) 
print('同时获取 a c 行,ABD 列,使用位置索引:') 
print(data.iloc[[0,2],[0,1,3]])

运行结果如图 22-41 所示:
在这里插入图片描述

​ 图 22-41 示例 22-25 运行效果图

  1. Series 的方法

Series 对象中有很多常用的方法可以对数据进行各种处理。例如,mean 方法可以对某 一列数据取平均数,min 方法获取最小值,max 方法获取最大值,std 方法获取标准差。

【示例 22-26】使用 meanminmaxstd 等方法对数据集进行各种运算,最后对数据集 进行排序操作

import pandas as pd

data = pd.DataFrame({
'Name':['zs','lisi','ww'],
'Sno':['1001','1002','1003'],
'Sex':['man','woman','man'],
'Age':[17,18,19],
'Score':[80,97,95] },columns=['Sno','Sex','Age','Score'],index=['zs','lisi','ww']) display('数据集',data)

ages = data['Age']
display('获取数据集中 Age 列的所有',ages)
print('计算 Age 列的平均值:',ages.mean())
print('计算 Age 列的最大值:',ages.max())
print('计算 Age 列的最小值:',ages.min())
print('计算 Age 列的标准差:',ages.std())
display('对 Age 进行降序排序:',ages.sort\_values(ascending=False)) 

运行结果如图 22-42 所示:
在这里插入图片描述

​ 图 22-42 示例 22-26 运行效果图

  1. Series 的条件过滤

Series 对象也可以像 SQL 语句一样,通过指定条件来过滤数据。 【示例 22-27Series 对象指定条件来过滤数据

import pandas as pd

data = pd.DataFrame({

'Name':['zs','lisi','ww'], 'Sno':['1001','1002','1003'], 'Sex':['man','woman','man'], 'Age':[17,18,19],

'Score':[80,97,95] },columns=['Sno','Sex','Age','Score'],index=['zs','lisi','ww']) display('数据集',data)

scores = data['Score'] display('筛选出成绩大于平均值的数据:',scores[scores>scores.mean()]) 

运行结果如图 22-43 所示:
在这里插入图片描述

​ 图 22-43 示例 22-27 运行效果图

  1. DataFrame 的条件过滤

DataFrame 与 Series 类似,也可以使用条件进行过滤。 【示例 22-28DataFrame 对象指定条件来过滤数据

import pandas as pd

data = pd.DataFrame({

‘Name’:[‘zs’,‘lisi’,‘ww’],

‘Sno’:[‘1001’,‘1002’,‘1003’], ‘Sex’:[‘man’,‘woman’,‘man’],

‘Age’:[17,18,19],

‘Score’:[80,97,95] },columns=[‘Sno’,‘Sex’,‘Age’,‘Score’],index=[‘zs’,‘lisi’,‘ww’]) display(‘数据集’,data)

scores = data[‘Score’]

display(‘输出数据中所有成绩大于平均值的记录’,data[scores>scores.mean()])

display(’ 获 取 成 绩 大 于 平 均 值 得 所 有 记 录 , 只 显 示 Sno Age Score 三 列 : ',data[scores>scores.mean()].loc[:,[‘Sno’,‘Age’,‘Score’]])

运行结果如图 22-44 所示:
在这里插入图片描述

​ 图 22-44 示例 22-28 运行效果图

  1. 处理缺失值

缺失值就是由某些原因导致部分数据为空,对于为空的这部分数据我们一般有两种处理 方式,一种是删除,即把含有缺失值的数据删除;另外一种是填充,即把缺失的那部分数据 用某个值代替。

  1. 缺失值查看

对缺失值进行处理,首先要把缺失值找出来,也就是查看哪列有缺失值。直接调用 info() 方法就会返回每一列的缺失情况。

【示例 22-29】缺失值查看

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])

df.info()

运行结果如图 22-45 所示:
在这里插入图片描述

​ 图 22-45 示例 22-29 运行效果图

Pandas 中缺失 值用 NaN 表示, 从用 info()方法的 结果来看,索 引 1 这一列 是 1 2 non-null float64,表示这一列有 2 个非空值,而应该是 3 个非空值,说明这一列有 1 个空值。

还可以用 isnull()方法来判断哪个值是缺失值,如果是缺失值则返回 True,如果不是缺 失值返回 False。

【示例 22-30】获取所有缺失值

data=pd.Series([3,4,np.nan,1,5,None])

print(‘isnull()方法判断是否是缺值:’)

print(data.isnull())

print(‘获取缺值:’)

print(data[data.isnull()])

print(‘获取非空值’)

print(data[data.notnull()])

运行结果如图 22-46 所示:
在这里插入图片描述

22-46 示例 22-30 运行效果图

  1. 缺失值删除

缺失值分为两种,一种是一行中某个字段是缺失值;另一种是一行中的字段全部为缺失 值,即为一个空白行。调用 dropna()方法删除缺失值,dropna()方法默认删除含有缺失值的 行,也就是只要某一行有缺失值就把这一行删除。如果想按列为单位删除缺失值,需要传入 参数 axis=’columns’。

【示例 22-31】删除缺失值

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) print(‘默认为以行为单位剔除:’)![ref8]

display(df.dropna())

print(‘以列为单位剔除:’) display(df.dropna(axis=‘columns’))

运行结果如图 22-47 所示:
在这里插入图片描述

​ 图 22-47 示例 22-31 运行效果图

如果想删除空白行,需要给 dropna()方法中传入参数 how=’all’即可,默认值是 any。 【示例 22-32】删除空白行

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) print(‘所有为 nan 时候才剔除:’) display(df.dropna(how=‘all’)) print(‘默认情况,只要有就剔除’) display(df.dropna(how=‘any’))

运行结果如图 22-48 所示:
在这里插入图片描述

​ 图 22-48 示例 22-32 运行效果图

  1. 缺失值填充

上面介绍了缺失值的删除,但是数据是宝贵的,一般情况下只要数据缺失比例不高(不 大于 30%),尽量别删除,而是选择填充。

调用 fillna()方法对数据表中的所有缺失值进行填充,在 fillna()方法中输入要填充的值。 还可以通过 method 参数使用前一个数和后一个数来进行填充。

【示例 22-33Series 对象缺失值填充

data=pd.Series([3,4,np.nan,1,5,None])
print('以 0 进行填充:')
display(data.fillna(0))
print('以前一个数进行填充:') 
display(data.fillna(method='ffill')) 
print('以后一个数进行填充:') 
display(data.fillna(method='bfill')) 
print('先按前一个,再按后一个') display(data.fillna(method='bfill').fillna(method='ffill')) 

运行结果如图 22-49 所示:
在这里插入图片描述

​ 图 22-49 示例 22-33 运行效果图

【示例 22-34DataFrame 对象缺失值填充

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) 
print('使用数值 0 来填充:')
display(df.fillna(0))
print('使用行的前一个数来填充:') 
display(df.fillna(method='ffill')) 
print('使用列的后一个数来填充:') 
display(df.fillna(method='bfill' ,axis=1))

运行结果如图 22-50 所示:
在这里插入图片描述

​ 图 22-50 示例 22-34 运行效果图

【示例 22-35】列的平均值来填充

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])

for i in df.columns:

​ df[i]=df[i].fillna(np.nanmean(df[i]))

df

运行结果如图 22-51 所示:
在这里插入图片描述

​ 图 22-51 示例 22-35 运行效果图

  1. 拼接

【示例 22-36Series 对象拼接

ser1=pd.Series([1,2,3],index=list(‘ABC’))

ser2=pd.Series([4,5,6],index=list(‘DEF’)) pd.concat([ser1,ser2])

运行结果如图 22-52 所示:
在这里插入图片描述

​ 图 22-52 示例 22-36 运行效果图

【示例 22-37】两个 df 对象拼接,默认找相同的列索引进行合并

def make_df(cols,index):
		data={c:[str(c)+str(i) for i in index] for c in cols}
		return pd.DataFrame(data,index=index) 

df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2])

运行结果如图 22-53 所示:
在这里插入图片描述

​ 图 22-53 示例 22-37 运行效果图

【示例 22-38】两个 df 对象拼接,添加 axis 参数

df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2],axis=1) #或者 pd.concat([df1,df2],axis='columns') 

运行结果如图 22-54 所示:
在这里插入图片描述

​ 图 22-54 示例 22-38 运行效果图

【示例 22-39】两个 df 对象拼接,索引重复问题

x=make_df(‘AB’,[1,2])

y=make_df(‘AB’,[1,2])

pd.concat([x,y])

运行结果如图 22-55 所示:
在这里插入图片描述

​ 图 22-55 示例 22-39 运行效果图

【示例 22-40】两个 df 对象拼接,解决索引重复问题加 ignore_index 属性

x=make_df(‘AB’,[1,2]) y=make_df(‘AB’,[1,2]) pd.concat([x,y],ignore_index=True)

运行结果如图 22-56 所示:
在这里插入图片描述

​ 图 22-56 示例 22-40 运行效果图

【示例 22-41】两个 df 对象拼接,解决索引重复问题,加 keys 属性

x=make_df(‘AB’,[1,2]) y=make_df(‘AB’,[1,2]) pd.concat([x,y],keys=list(‘xy’)) ![ref9]运行结果如图 22-57 所示:
在这里插入图片描述

​ 图 22-57 示例 22-41 运行效果图

【示例 22-42】两个 df 对象拼接,join 内连接做交集

a=make_df(‘ABC’,[1,2])

b=make_df(‘BCD’,[3,4])

pd.concat([a,b],join=‘inner’)

运行结果如图 22-58 所示:
在这里插入图片描述

​ 图 22-58 示例 22-42 运行效果图

  1. merge 的使用

pandas 中的 merge 和 concat 类似,但主要是用于两组有 key column 的数据,统一索引 的数据。通常也被用在 Database 的处理当中。

合并时有 4 种方式 how = [‘left’, ‘right’, ‘outer’, ‘inner’],默认值 how=‘inner’。

【示例 22-43merge 的使用,默认以 how=inner’进行合并

left=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k2’,‘k3’], ‘A’:[‘A0’,‘A1’,‘A2’,‘A3’],

‘B’:[‘B0’,‘B1’,‘B2’,‘B3’], })

right=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k4’,‘k3’],

‘C’:[‘C0’,‘C1’,‘C2’,‘C3’], ‘D’:[‘D0’,‘D1’,‘D2’,‘D3’],

}) result=pd.merge(left,right)

运行结果如图 22-59 所示:
在这里插入图片描述

​ 图 22-59 示例 22-43 运行效果图

【示例 22-44merge 的使用,参数 how=outer’进行合并

left=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k2’,‘k3’],

‘A’:[‘A0’,‘A1’,‘A2’,‘A3’], ‘B’:[‘B0’,‘B1’,‘B2’,‘B3’],

})

right=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k4’,‘k3’],

‘C’:[‘C0’,‘C1’,‘C2’,‘C3’], ‘D’:[‘D0’,‘D1’,‘D2’,‘D3’],

})

pd.merge(left,right,how=‘outer’)

运行结果如图 22-60 所示:
在这里插入图片描述

​ 图 22-60 示例 22-44 运行效果图

【示例 22-45merge 的使用,参数 how=left’进行合并

left=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k2’,‘k3’], ‘A’:[‘A0’,‘A1’,‘A2’,‘A3’],

‘B’:[‘B0’,‘B1’,‘B2’,‘B3’], })

right=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k4’,‘k3’],

‘C’:[‘C0’,‘C1’,‘C2’,‘C3’], ‘D’:[‘D0’,‘D1’,‘D2’,‘D3’],

}) pd.merge(left,right,how=’left’)

运行结果如图 22-61 所示:
在这里插入图片描述

​ 图 22-61 示例 22-45 运行效果图

【示例 22-46】行索引不同, how=right’进行合并

left=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k2’,‘k3’], ‘A’:[‘A0’,‘A1’,‘A2’,‘A3’],

‘B’:[‘B0’,‘B1’,‘B2’,‘B3’], })

right=pd.DataFrame({‘key’:[‘k0’,‘k1’,‘k4’,‘k3’],

‘C’:[‘C0’,‘C1’,‘C2’,‘C3’], ‘D’:[‘D0’,‘D1’,‘D2’,‘D3’],

}) pd.merge(left,right,how=’right’)

运行结果如图 22-62 所示:
在这里插入图片描述

​ 图 22-62 示例 22-46 运行效果图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值