【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

news2024/11/25 12:24:14

向阳花花花花 - 个人主页

迄今所有人生都大写着失败,但并不妨碍我继续向前

Python 数据分析专栏  正在火热更新中 🔥


文章目录

  • 一、concat
  • 二、append
  • 三、merge
    • 3.1 没有属性相同时
    • 3.2 只有一个属性相同时
        • 1.一对一合并
        • 2.一对多合并
        • 3.多对多合并
    • 3.3 有多个属性相同时
    • 3.4 merge连接模式
  • 结语
  • 文末送书

一、concat

pd.concat() 函数可以沿着指定的轴将多个 dataframe 或者 series 拼接到一起,这一点和另一个常用的 pd.merge() 函数不同,pd.merge()函数只能实现两个表的拼接。

concat 默认是上下合并,下面讲解该函数的常用参数。

参数作用
axis控制轴,值为0为横轴,1为纵轴
ignore_index忽略行索引,将行索引重置(0-N-1)
keys设置多层索引
joinjoin=outer,相当于取并集,补NaN模式,是默认模式;join=inner,相当于取交集,只连接匹配的项

首先导入包:

import numpy as np
import pandas as pd

定义一个返回 dataframe 对象的函数:

def make_df(indexs,columns):
    data = [[str(j)+str(i) for j in columns] for i in indexs]
    df = pd.DataFrame(data=data,index=indexs,columns=columns)
    return df

获取两个 dataframe 对象:

df1 = make_df([1,2],['A','B'])
df2 = make_df([3,4],['A','B'])
display(df1,df2)

展示 df1 和 df2 :

将 df1 和 df2 使用 concat 合并:

pd.concat([df1,df2])

得到如下结果:

使用 axis 控制合并方向:

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

得到如下结果:

使用 ignore_index 重置索引:

pd.concat([df1,df2],ignore_index=True)

运行结果如下:

使用 keys 设置多层索引:

pd.concat([df1,df2],keys=['one','two'])

结果如下:

为了演示 join 参数,重新构建两个 dataframe 对象,演示结果如下。

构建两个 dataframe 对象:

df1 = make_df(indexs=[1,2,3],columns=['A','B','C'])
df2 = make_df(indexs=[2,3,4],columns=['B','C','D'])
display(df1,df2)

展示 df1 和 df2 :

外连接:

pd.concat([df1,df2],join='outer',sort=True)

得到如下结果:

其中,sort = True 是为了解决如下警告而添加的:


内连接:

pd.concat([df1,df2],join='inner')

结果如下:

二、append

pd.append() 函数专门用于在 dataframe 对象后 添加新的行,如果添加的列名不在 dataframe 对象中,将会被当作新的列进行添加。

还是使用上面的 df1 和 df2 对象,先查看一下:

display(df1,df2)


然后使用 append 追加:

df1.append(df2,sort=True)

结果如下:

三、merge

pd.merge() 的使用需要分 3 种情况讨论:当需要合并的两个 dataframe 对象,没有属性相同时,只有一个属性相同时,有多个属性相同时。

3.1 没有属性相同时

如果两个 dataframe 对象没有相同的属性,则需要使用 left_onright_on 分别来指定2个表中不同列作为连接的字段。

首先构建两个 dataframe 对象:

df1 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df2 = pd.DataFrame({
    'sex':['男','女','男'],
    'job':['Saler','CEO','Programmer']
})
display(df1,df2)

展示 df1 和 df2 结果如下:


可以看到两个 df 对象没有相同字段,下面使用 merge 连接:

df1.merge(df2,left_on='id',right_index=True)

注意:要合并的两个列,必须要有相同的值才能合并,否则报错,下面是错误示例:

df1.merge(df2,left_on='name',right_on='sex')

报错部分截图如下:

也可以使用行索引作为连接的字段:left_index=True 左表使用行索引作为连接字段,right_index=True 右表使用行索引作为连接字段。

3.2 只有一个属性相同时

只有一个属性列相同时,也分为三种情况,分别是一对一合并,一对多合并,多对多合并。

1.一对一合并

当属性值在一个 dataframe 对象中不重复时,为一对一合并。

首先构建两个 dataframe 对象:

df1 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,3],
    'age':[22,33,44]
})
df2 = pd.DataFrame({
    'id':[2,3,4],
    'sex':['男','女','男'],
    'job':['Saler','CEO','Programmer']
})
display(df1,df2)

查看 df1 和 df2 :


两个 dataframe 对象,只有一个相同的属性列 id ,并且两个 df 对象的 id 列都是唯一的,不重复。

下面使用 merge 合并:

df1.merge(df2)

结果如下:

2.一对多合并

当属性值在一个 dataframe 对象中有两个或以上相同值时,为一对多合并。

重新构建两个 dataframe 对象:

df3 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df4 = pd.DataFrame({
    'id':[2,3,4],
    'sex':['男','女','男'],
    'job':['Saler','CEO','Programmer']
})
display(df3,df4)

查看 df3 和 df4 :

可以看到,两个 dataframe 对象,只有一个相同的属性列 id,并且只有 df3 的 id 有重复值。

下面使用 merge 合并:

df3.merge(df4)

得到如下结果:

3.多对多合并

两个 dataframe 对象同一个属性都有两个或以上相同值,为多对多合并。

重新构建两个 dataframe 对象:

df5 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df6 = pd.DataFrame({
    'id':[2,2,4],
    'sex':['男','女','男'],
    'job':['Saler','CEO','Programmer']
})
display(df5,df6)

查看 df5 和 df6 :

可以看到,两个 dataframe 对象,只有一个相同的属性列 id,并且 df5 和 df6 的 id 均有重复值。

下面使用 merge 合并:

df5.merge(df6)

得到如下结果:

3.3 有多个属性相同时

如果不止一个属性相同,那么merge合并,只有多个属性值相同才能合并,否则报错;
此时需要使用参数 on 指定一个属性作为连接的字段。

重新构建两个 dataframe 对象:

df1 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df2 = pd.DataFrame({
    'id':[2,3,4],
     'age':[2,3,4],
    'job':['Saler','CEO','Programmer']
})
display(df1,df2)

查看 df1 和 df2:

可以看到,两个 df 对象有两个相同的列 idage,如果我们直接合并:

df1.merge(df2)

会报如下错误(只截取部分):


此时,需要使用 on 参数指定连接的属性,这里指定 id 为连接属性:

df1.merge(df2,on='id')

查看结果:

因为 age 字段重复了,所以 pandas 自动给 age 用 _x _y 的形式区分开来了,我们可以通过 suffixes 属性指定重复时的后缀名。

df1.merge(df2,on='id',suffixes=['_1','_2'])

结果如下:

3.4 merge连接模式

merge 连接模式类似于关系型数据库表的连接方式,包括内连接(交、how = inner)、外连接(并,how = outer)、左外连接(how = left)、右外连接(how = right)。通过 how 属性可以指定连接模式,默认是外连接。

首先构建两个 dataframe 对象:

df5 = pd.DataFrame({
    'name':['张三','李四','王五'],
    'id':[1,2,2],
    'age':[22,33,44]
})
df6 = pd.DataFrame({
    'id':[2,2,4],
    'sex':['男','女','男'],
    'job':['Saler','CEO','Programmer']
})
display(df5,df6)

查看 df5 和 df6 :

外连接:

df5.merge(df6,how='outer')


内连接:

df5.merge(df6,how='inner')

左外连接:

df5.merge(df6,how='left')

右外连接:

df5.merge(df6,how='right')

由于篇幅原因,这里不再演示每一个的结果,大家可以自己动手实践。

结语

本文主要带大家了解 pandas 中的数据合并3个函数,在后面的学习中会经常使用到。


您的支持是我创作的动力

希望我的文章能成为您的有用参考

我会继续改进和分享更好的内容


🔥 如果文中有些地方不清楚的话,欢迎联系我,我会给大家提供思路及解答。🔥

文章直达链接
上期回顾【数据分析 - 基础入门之pandas篇③】- pandas数据结构——DataFrame
下期预告【数据分析 - 基础入门之pandas篇⑤】- pandas 数据清洗

文末送书

这是博主第一次开展送书活动,是和出版社谈了好久才谈成的给予粉丝的福利。

《Python从入门到精通》(第三版)是“软件开发视频大讲堂”丛书中的三剑客之一,代码基于Python 3.11,涵盖语言新特性,如:match…case语句、类型联合运算符、异步编程等。

本书配套了41小时同步微课视频,让学习更轻松);127个实例,随学随练;还有32个“实践与练习”,可以帮助我们巩固所学技能;还有Python六大热门应用方向,每个方向都在剖析技术储备之后设计并实现对应的热门项目,具体包括游戏开发与项目、爬虫开发与项目、数据可视化与项目、Web开发与项目、Python自动化办公、人工智能初探,可使读者将所学的Python基础知识与当前的Python开发热点无缝对接,成就Python开发无限可能;更有在线开发资源库,随查随用,可以快速提升编程水平和解决实际问题的能力。

  • 本次送书一本
  • 活动时间:截止到2023年7月25日
  • 参与方式:关注博主、点赞、收藏并评论 “人生苦短,我用Python”
  • 抽奖方式:利用程序产生随机数,对应哪条评论即为中奖
  • 如何查看自己是否获奖:如果获奖我会私信你们哟,记得关注我,不然中奖了联系不上!

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

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

相关文章

爬楼梯,假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

题记: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例…

mysql开启binlog并配置定期删除以及文件大小,删库跑路之数据恢复

一、开启并binlog日志并配置 1、配置文件 [mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirC:\\JJS\\software\\mysql-5.7.41-winx64\\mysql-5.7.41-winx64 # 允许最大连接数 max_connections200 # 服务端使用的字符集默认为8比特编码的latin1字符集 chara…

Vue前端生成UUID

基础使用 当使用Vue.js生成UUID时,我们可以使用 uuid 库来帮助我们生成通用唯一标识符(UUID)。UUID是一个128位的唯一标识符,它可以用于唯一标识对象、实体或数据。 以下是在Vue.js中生成UUID的详细步骤: 首先&…

SpringBoot——自动装配之@Import

文章目录 前言ImportImport 的作用1、Import(MyDemo1.class) 将某个对象加载至bean容器中2、Import一个类 该类实现了ImportSelector, 重写selectImports方法该方法返回了String[]数组的对象,数组里面的类都会注入到spring容器当中3、Import一个类,该类实…

Premiere Pro 2023(23.5) Mac

Premiere Pro是一个业界领先的视频编辑软件,旨在帮助用户快速、高效地制作和编辑专业质量的视频内容。作为Creative Cloud套装中的一部分,Premiere Pro具有丰富的功能和工具,可应对各种视频编辑需求。 Premiere Pro的主要特点包括多个视频和音…

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码

Unity游戏源码分享-Unity版本的经典斗地主游戏完整源码 工程地址: https://download.csdn.net/download/Highning0007/88057828

css+js实现点击特效效果

话不多说&#xff0c;先上效果图 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

详细进行wrnchAI 与OpenPose 的姿势检测估计系统的各项性能比较

本文将对wrnchAI 与OpenPose的性能进行比较。我们评估了人体姿势估计系统,并通过比较 wrnchAI 与 OpenPose 的以下参数来报告我们的发现: 准确性运算速度系统要求型号尺寸其他特性 移动支持跟踪支持。绿屏分割。支持应用程序开发。许可易于设置和使用披露:我们从 wrnch 收…

Java - 集合

开篇 数组和集合对比 数组的不足: 1、长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能修改&#xff0c;灵活性不够 2、保存的必须为同一类型的元素 3、使用数组进行增删元素的方法比较麻烦 集合 1、可以动态的保存任意多个对象 2、提供一系列操作对象的方法…

基于ResNet50算法实现图像分类识别

概要 在本文中将介绍使用Python语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练&#xff0c;观察其模型训练效果。 一、目录 ResNet50介绍 图片模型训练预测 项目扩展 二、ResNet50介绍 ResNet50是一种基于深度卷积神经网络&#xff…

智迪科技在创业板上市:市值约31亿元,谢伟明和黎柏松为实控人

7月17日&#xff0c;珠海市智迪科技股份有限公司&#xff08;下称“智迪科技”&#xff0c;SZ:301503&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;智迪科技的发行价为31.59元/股&#xff0c;发行数量为2000万股&#xff0c;募资总额约为6.32亿元&#xff0c;…

多线程、高并发(理解一)

线程的简单了解 进程、线程、纤程创建线程的几种方式synchronizedvolatileAtomicXJUC 同步锁ReentrantLockCountDownLatch 倒数的门栓CyclicBarrier 复杂操作完成&#xff0c;再走后续逻辑Phaser 所有线程需要在屏障上等待才能进入下一步执行ReadWriteLockSemaphoreExchanger 线…

MQTT协议在物联网环境中的应用及代码实现解析(三)

三、使用C#PC端编程读取MQTT服务器上特定的主题信息 以下是使用C#编程利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息&#xff0c;并动态显示在多行文本框中的程序代码示例&#xff0c;包括完整的代码注释和编程说明&#xff1a; us…

javascript中过滤二维对象数组重复的字段并只保留唯一值(array.filter与Array.from)

javascript中过滤二维对象数组重复的字段并只保留唯一值 1.Array.filter过滤array.filter()方法 2.Array.from过滤Array.from方法 1.Array.filter过滤 在JavaScript中&#xff0c;你可以使用Array.filter()和Set数据结构来过滤二维对象数组中重复的字段&#xff0c;只保留唯一…

CSS三栏布局的几种自适应的排版方式

CSS三栏布局的几种方式&#xff0c;主要有 float、position、flex实现。 对红色、蓝色 box 设置 float&#xff0c;绿色不设。 <style>* {margin: 0;padding: 0;}.left {width: 200px;height: 300px;background-color: red;float:left;}.right {width: 200px;height: 300…

计算机图形硬件(二) 5 - 4 硬拷贝设备

我们可以使用几种格式来获得图像的硬拷贝输出。为了演示或存档&#xff0c;可以将图像文件传送到生成投影胶片、35 mm幻灯片或电影胶片的设备与服务部门。也可将图形输出到打印机或绘图仪上&#xff0c;从而在纸上打印出图像。 输出设备生成图片的质量依赖于可显示的点的大小和…

浅尝python 一

浅尝python一 一、注释二、指定数值精度三、算数运算符四、字符串格式化输出五、打印六、类型转换&#xff0c;不会改变原数据七、比较运算符综合练习 一、注释 1、单行注释&#xff0c;快捷键 command/ # 此行被注释掉 2、多行注释 本行被注释 本行被注释or""&quo…

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…

matplotlib用面积填充实现lmplot

文章目录 示例参数回归图 示例 在绘图时经常遇到类似区域填充的问题&#xff0c;比如对于 y sin ⁡ x y\sin x ysinx函数&#xff0c;想填充其与X轴所围成的区间&#xff0c;那么就可以使用fill_between函数。 import numpy as np import matplotlib.pyplot as pltx np.ara…

Java开发基础系列(八):泛型及反射

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(八):泛型及反射 ⏱️ 创作时间&#xff1a; 2023年0…