Python之数据合并——【concat()函数、merge()函数、join()方法、combine_first()方法】

文章目录

  • 轴向堆叠数据——concat()函数
    • 横向堆叠与外连接
    • 纵向堆叠与内连接
  • 主键合并数据——merge()函数
    • 内连接方式
    • 外连接方式
    • 左连接方式
    • 右连接方式
    • 其他
  • 根据行索引合并数据——join()方法
    • 四种连接方式
    • 行索引与列索引重叠
  • 合并重叠数据——combine_first()方法


轴向堆叠数据——concat()函数

pandas.concat(
objs: Union[
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
],
axis=0,
join=“outer”,
ignore_index: bool = False,
keys=None,
levels=None,
names=None,
verify_integrity: bool = False,
sort: bool = False,
copy: bool = True,
)

上述函数中常用参数表示的含义如下:

join:表示连接的方式,inner表示内连接,outer表示外连接,默认使用外连接。

ignore_index:接受布尔值,默认为False。如果设置为True,则表示清除现有索引并重置索引值。

keys:接受序列,表示添加最外层索引。

levels:用于构建MultiIndex的特定级别(唯一值)

names:在设置了keys和levels参数后,用于创建分层级别的名称

verify_integerity:检查新的连接轴是否包含重复项。接收布尔值,当设置为True时,如果有重复的轴将会抛出错误,默认为False


根据轴方向的不同(axis参数),可以将堆叠分成横向堆叠和纵向堆叠默认采用的是纵向堆叠方式。在堆叠数据时,默认采用的是外连接,(join参数设为outer)的方式。

横向堆叠与外连接

使用concat()函数合并时,若是将axis参数的值设为1,且join参数的值设为outer,则合并方式为横向堆叠与外连接。

测试对象:

left:A   B
a  A0  B0
b  A1  B1
right:C   D
c  C0  D0
d  C1  D1

代码:

left = pd.DataFrame({'A': ['A0', 'A1'],'B': ['B0', 'B1']},index=['a', 'b'])
right = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},index=['c', 'd'])
print(pd.concat([left, right], join='outer', axis=1))

输出结果:

     A    B    C    D
a   A0   B0  NaN  NaN
b   A1   B1  NaN  NaN
c  NaN  NaN   C0   D0
d  NaN  NaN   C1   D1

使用concat()函数合并之后产生的不存在的数据将用NaN进行填充。


纵向堆叠与内连接

使用concat()函数合并时,若是将axis参数的值设为0,且join参数的值设为inner,则合并方式为纵向堆叠与内连接。

测试对象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df2:B   C   D
0  B3  C3  D3
1  B4  C4  D4
2  B5  C5  D5

代码:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df2 = pd.DataFrame({'B': ['B3', 'B4', 'B5'],'C': ['C3', 'C4', 'C5'],'D': ['D3', 'D4', 'D5']})
print(pd.concat([df1, df2], join='inner', axis=0))

输出结果

    B   C
0  B0  C0
1  B1  C1
2  B2  C2
0  B3  C3
1  B4  C4
2  B5  C5

主键合并数据——merge()函数

主键合并根据一个多个键将不同的DaraFrame对象连接起来,大多数是将两个DataFrame对象中重叠作为合并的键。

merge(
left,
right,
how: str = “inner”,
on=None,
left_on=None,
right_on=None,
left_index: bool = False,
right_index: bool = False,
sort: bool = False,
suffixes=("_x", “_y”),
copy: bool = True,
indicator: bool = False,
validate=None,
)

上述函数中部分参数表示的含义如下:

  1. left:参与合并的的左侧DataFrame对象
  2. right:参与合并的的右侧DataFrame对象
  3. how:表示连接方式,默认为inner,该参数支持以下的取值:
    · left:使用左侧的DataFrame的键,类似于SQL的左外连接
    · right:使用右侧的DataFrame的键,类似于SQL的右外连接
    · outer:使用两个DataFrame所有的键,类似于SQL的全连接
    · inner:使用两个DataFrame键的交集,类似于SQL的内连接
  4. on:用于连接的列名。必须存在于左右两个DataFrame对象中
  5. left_on:以左侧的DataFrame作为连接键
  6. right_on:以右侧的DataFrame作为连接键
  7. left_index:左侧的行索引用作连接键
  8. right_index:右侧的行索引用作连接键
  9. sort:是否排序,接受布尔值,默认为False
  10. suffixes:用于追加都重叠列名的末尾,默认为(_x,_y)

内连接方式

默认采用how=inner的方式合并

测试对象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代码:

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']})
df3 = pd.DataFrame({'B': ['B0', 'B2', 'B4'],'C': ['C0', 'C2', 'C4'],'D': ['D3', 'D4', 'D5']})
print("pd.merge:\n", pd.merge(df1, df3, on=['B', 'C']))

输出结果:

pd.merge:A   B   C   D
0  A0  B0  C0  D3
1  A2  B2  C2  D4

外连接方式

外连接方式(how=outer):left与right列中相同的数据将会重叠,没有数据的位置使用NaN进行填充。

测试对象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代码:

print("pd.merge(how=outer):\n", pd.merge(df1, df3, on=['B', 'C'], how='outer'))

输出结果:

pd.merge(how=outer):A   B   C    D
0   A0  B0  C0   D3
1   A1  B1  C1  NaN
2   A2  B2  C2   D4
3  NaN  B4  C4   D5

左连接方式

左连接方式(how=left):以左表作为基准进行连接,left表中的数据会全部显示,right表中只会显示与重叠数据行索引值相同的数据,合并后表中缺失的数据会使用NaN进行填充。

测试对象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代码:

print("pd.merge(how=left):\n", pd.merge(df1, df3, on=['B', 'C'], how='left'))

输出结果:

pd.merge(how=left):A   B   C    D
0  A0  B0  C0   D3
1  A1  B1  C1  NaN
2  A2  B2  C2   D4

右连接方式

右连接方式(how=left):以右表作为基准进行连接,right表中的数据会全部显示,left表中只会显示与重叠数据行索引值相同的数据,合并后表中缺失的数据会使用NaN进行填充。

测试对象:

df1:A   B   C
0  A0  B0  C0
1  A1  B1  C1
2  A2  B2  C2
df3:B   C   D
0  B0  C0  D3
1  B2  C2  D4
2  B4  C4  D5

代码:

print("pd.merge(how=right):\n", pd.merge(df1, df3, on=['B', 'C'], how='right'))

测试结果:

pd.merge(how=right):A   B   C   D
0   A0  B0  C0  D3
1   A2  B2  C2  D4
2  NaN  B4  C4  D5

其他

即使两张表中的行索引与列索引均没有重叠的部分,也可以使用merge()函数来合并。只需要将参数left_index和right_index的值设置为True即可。

测试对象

left:A   B
a  A0  B0
b  A1  B1
right:C   D
c  C0  D0
d  C1  D1

代码:

print("pd.merge(left_index=right_index=True):\n",pd.merge(left, right, how='outer', left_index=True, right_index=True))

输出结果:

      A    B    C    D
a   A0   B0  NaN  NaN
b   A1   B1  NaN  NaN
c  NaN  NaN   C0   D0
d  NaN  NaN   C1   D1

根据行索引合并数据——join()方法

join(self, other, on=None, how=“left”, lsuffix="", rsuffix="", sort=False)

上述方法常用参数表示的含义如下:

  1. on:用于连接列名
  2. how:可从{‘left’,‘right’,‘outer’,‘inner’}中任选一个,默认使用left的方式
  3. lsuffix:接受字符串,用于在左侧重叠的列名后添加后缀名
  4. rsuffix:接受字符串,用于在右侧重叠的列名后添加后缀名
  5. sort:接受布尔值,根据连接键对合并的数据进行排序,默认为False

四种连接方式

测试对象:

data1:A   B   C
a  A0  B0  C0
b  A1  B1  C1
c  A2  B2  C2
data2:B   C   D
b  B1  C1  D1
c  B2  C2  D2
d  B3  C3  D3

代码:

data1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'C': ['C0', 'C1', 'C2']},index=['a', 'b', 'c'])
data2 = pd.DataFrame({'B': ['B1', 'B2', 'B3'],'C': ['C1', 'C2', 'C3'],'D': ['D1', 'D2', 'D3']},index=['b', 'c', 'd'])
print("data1.join(data2, how='outer', lsuffix='one'):\n",data1.join(data2, how='outer', lsuffix='one'))
print("data1.join(data2, how='inner', rsuffix='two'):\n", 
data1.join(data2, how='inner', rsuffix='two'))
print("data1.join(data2, how='left', lsuffix='one'):\n", 
data1.join(data2, how='left', lsuffix='one'))
print("data1.join(data2, how='right', rsuffix='two'):\n", 
data1.join(data2, how='right', rsuffix='two'))

输出结果:

data1.join(data2, how='outer', lsuffix='one'):A Bone Cone    B    C    D
a   A0   B0   C0  NaN  NaN  NaN
b   A1   B1   C1   B1   C1   D1
c   A2   B2   C2   B2   C2   D2
d  NaN  NaN  NaN   B3   C3   D3
data1.join(data2, how='inner', rsuffix='two'):A   B   C Btwo Ctwo   D
b  A1  B1  C1   B1   C1  D1
c  A2  B2  C2   B2   C2  D2
data1.join(data2, how='left', lsuffix='one'):A Bone Cone    B    C    D
a  A0   B0   C0  NaN  NaN  NaN
b  A1   B1   C1   B1   C1   D1
c  A2   B2   C2   B2   C2   D2
data1.join(data2, how='right', rsuffix='two'):A    B    C Btwo Ctwo   D
b   A1   B1   C1   B1   C1  D1
c   A2   B2   C2   B2   C2  D2
d  NaN  NaN  NaN   B3   C3  D3

行索引与列索引重叠

测试对象:

join1:A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
join2:C   D
K0  C0  D0
K1  C1  D1
K2  C2  D2

代码:

join1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'],'key': ['K0', 'K1', 'K2']})
join2 = pd.DataFrame({'C': ['C0', 'C1', 'C2'],'D': ['D0', 'D1', 'D2']},index=['K0', 'K1', 'K2'])
print("join1.join(join2, on='key'):\n", join1.join(join2, on='key'))

输出结果:

join1.join(join2, on='key'):A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K2  C2  D2

合并重叠数据——combine_first()方法

使用combine_first()方法合并两个DataFrame对象时,必须确保它们的行索引和列索引有重叠的部分。

combine_first(self, other: “DataFrame”)

上述方法中只有一个参数other,该参数用于接收填充缺失值的DataFrame对象。

测试对象:

test1:A    B
0  NaN   B0
1   A1  NaN
2   A2   B2
3   A3  NaN
test2:A   B
1  C0  D0
0  C1  D1
2  C2  D2

代码:

test1 = pd.DataFrame({'A': [np.nan, 'A1', 'A2', 'A3'],'B': ['B0', np.nan, 'B2', np.nan]})
test2 = pd.DataFrame({'A': ['C0', 'C1', 'C2'],'B': ['D0', 'D1', 'D2']},index=[1, 0, 2])
print("test1.combine_first(test2):\n", test1.combine_first(test2))

输出结果:

test1.combine_first(test2):A    B
0  C1   B0
1  A1   D0
2  A2   B2
3  A3  NaN

从上可知,尽管test2表中的行索引与test1表的行索引顺序不同,当用test2表的数据替换test1表的NaN值时,替换数据与缺失数据的索引位置仍然是相同的。例如,test1表中位于第0行第A列的“NaN”需要使用test2表中相同位置的数据“C1"来替换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超硬核!操作系统学霸笔记,考试复习面试全靠它

之后会发布基于基础知识的大部分算法的模拟代码合集,敬请关注。 进程基础 进程的基本概念 程序顺序执行的特征: 1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封…

配置tomcat6.0的HTTPS(单向)

利用JDK自带的产生证书的工具 生成证书 建立一个脚本文件,内容如下: set SERVER_DN"CNServer, OUshare, Oshare, Lsz, Sgd, CCN" set CLIENT_DN"CNClient, OUshare, Oshare, Lsz, Sgd, CCN" set KS_PASS-storepass changeit set KE…

Python之数据重塑——【stack()方法和unstack()方法、pivot()方法】

文章目录重塑层次化索引对于单层索引的DataFrame类对象stack()方法unstack()方法对于多层索引的DataFrame类对象辨析操作内层索引与外层索引的区别查看多层索引对象转换后的类型轴向旋转——pivot()方法重塑层次化索引 Pandas中重塑层次化索引的操作主要是stack()方法和unstac…

超硬核!学霸把操作系统经典算法给敲完了!要知行合一

上期的笔记,浏览快1万了,既然关注的人很多,那就发出来承诺过的算法全模拟,希望帮到你们。 上期的操作系统学霸笔记,考试复习面试全靠它 一、模拟进程调度 功能 data.h #ifndef _Data_h_ #define _Data_h_#include …

Python之数据转换——【rename()方法、cut()函数、get_dummies()函数】

文章目录重命名轴索引离散化连续数据哑变量处理类别型数据重命名轴索引 rename( self, mapper: Optional[Renamer] None, *, index: Optional[Renamer] None, columns: Optional[Renamer] None, axis: Optional[Axis] None, copy: bool True, inplace: bool False, level…

超硬核!数据结构学霸笔记,考试面试吹牛就靠它

上次发操作系统笔记,很快浏览上万,这次数据结构比上次硬核的多哦,同样的会发超硬核代码,关注吧。 超硬核!操作系统学霸笔记,考试复习面试全靠它 第一次笔记(复习c,课程概述&#xff…

Python之数据拆分——groupby()方法

文章目录groupby()方法通过列名进行分组通过Series对象进行分组Series对象与原数据的行索引长度相等Series对象与原数据的行索引长度不等通过字典进行分组按照columns轴的方向进行分组按照index轴的方向进行分组通过函数进行分组groupby()方法 groupby( self, byNone, axis0, l…

超硬核!小白读了这篇文章,就能在算法圈混了

作为一只超级硬核的兔子,从来不给你说废话,只有最有用的干货!这些神级算法送给你 目录 第一节 1.1bogo排序 1.2位运算 1.3打擂台 1.4morris遍历 第二节 2.1睡眠排序 2.2会死的兔子 2.3矩阵快速幂 2.4摔手机/摔鸡蛋 时空复杂度目录 …

Python之数据聚合——aggregate()方法

文章目录使用内置统计方法聚合数据面向列的聚合方法aggregate()方法对每一列数据应用同一个函数对某列数据应用不同的函数对不同列数据应用不同函数使用内置统计方法聚合数据 实现数据拆分成组并分别计算平均数的操作 代码: import pandas as pd import numpy as…

超硬核十万字!全网最全 数据结构 代码,随便秒杀老师/面试官,我说的

本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧? 当然如果落下什么了欢迎大家评论指出 目录 顺序存储线性表实现 单链表不带头标准c语言实现 单链表不带头压缩c语言实现 约瑟…

Python之分组级运算——【transform()方法、apply()方法】

文章目录数据转换——transform()方法数据应用——apply()方法数据转换——transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述,我们知道aggregate()方法返回的数据集的形状(shape)与被分组的数据集的形状是不同的…

java限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是: 1、在同一台电脑上一次只允许有一个用户登录系统; 2、一个用户在同一时间只允许在一个客户端登录…

Matplotlib——绘制图表

文章目录通过figure()函数创建画布通过subplot()函数创建单个子图通过subplots()函数创建多个子图通过add_subplot()方法添加和选中子图添加各类标签绘制常见图表绘制直方图——hist()函数绘制散点图——scatter()函数绘制柱状图——bar()函数设定线条的相关参数本地保存图片通…

限制在同一台电脑上只允许有一个用户登录系统

在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。 具体一点就是: 1、在同一台电脑上一次只允许有一个用户登录系统; 2、一个用户在同一时间只允许在一个客户端登录…

Seaborn——绘制统计图形

文章目录可视化数据的分布绘制单变量分布绘制双变量分布绘制成对的双变量分布用分类数据绘图类别散点图通过stripplot()函数画散点图swarmplot()函数类别内的数据分布绘制箱型图绘制提琴图类别内的统计估计绘制条形图绘制点图可视化数据的分布 绘制单变量分布 一般采用最简单…

Bokeh——交互式可视化库

文章目录前言如何通过Plotting绘制图形前言 Bokeh是一个专门针对Web浏览器使用的交互式可视化库,这是与其他可视化库相比最核心的区别。 如何通过Plotting绘制图形 Plotting是以构建视觉符号为核心的接口,可以结合各种视觉元素(例如&#x…

指针、引用以及const限定符、constexpr限定符

文章目录复合类型引用概念与使用引用的定义注意指针概念声明方式取地址符指针值空指针利用指针访问对象赋值和指针void* 指针指向指针的指针指向指针的引用初始化所有指针有多重含义的某些符号const限定符概念const的引用指针和const顶层const和底层constconstexpr和常量表达式…

关键字typedef、关键字using、auto类型说明符和declytpe类型指示符

文章目录类型别名概念关键字 typedef别名声明 (alias declaration) using指针、常量和类型别名类型别名简化多维数组指针auto类型说明符概念复合类型、常量和autodecltype类型指示符概念decltype和引用类型别名 概念 有两种方法可用于定义类型别名。 关键字 typedef typede…

初始化、赋值、默认初始化、列表初始化、类内初始值、直接初始化与拷贝初始化

文章目录初始化和赋值的区别什么是默认初始化?列表初始化列表初始化的使用场景不适合使用列表初始化的场景类内初始值混用string对象和C风格字符串数组与vector对象关于vector对象两者间的初始化关系直接初始化与拷贝初始化初始化和赋值的区别 初始化的含义是创建变…

js动态增加,删除td,tr,table,div

js实现的动态添加,删除table内容: 截图如下: 1. 2. 源代码: main.css body {background-image: url(../images/qiantai/bg.png);font-family: arial;font-size: 12px;color: #d4d7da;text-align: center;background-repeat: r…