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

news/2024/5/17 5:27:40/文章来源:https://blog.csdn.net/qq_62592360/article/details/131747128

向阳花花花花 - 个人主页

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

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.luyixian.cn/news_show_332618.aspx

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

相关文章

品牌营销策略:如何有效打造品牌知名度与口碑?

品牌营销策略是企业在市场竞争中脱颖而出的重要手段,它能够帮助企业树立品牌形象,提升品牌知名度,增强品牌影响力,从而获得更多的市场份额和利润。那么,如何制定一套有效的品牌营销策略呢?以下是一秒推小编…

Spring【AOP】

AOP-面向切面编程 AOP&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 SpringAop中&#xff0c;通过Advice定义横切逻辑&#xff0c;并支持5种类型的Advice&#xff1a; 导入依赖 <dependency><groupId>…

webpack打包之 copy-webpack-plugin

copy-webpack-plugin 打包复制文件插件。 1、什么时候要使用&#xff1f; 在离线应用中&#xff0c;前端所有文件都需在在本地&#xff0c;有些文件&#xff08;比如iconFont以及一些静态img)需要转为离线文件&#xff0c;这些文件可以直接引用更方便些&#xff0c;这就需要在打…

Redis学习(三)持久化机制、分布式缓存、多级缓存、Redis实战经验

文章目录 分布式缓存Redis持久化RDB持久化AOF持久化 Redis主从Redis数据同步原理全量同步增量同步 Redis哨兵哨兵的作用和原理sentinel&#xff08;哨兵&#xff09;的三个作用是什么&#xff1f;sentinel如何判断一个Redis实例是否健康&#xff1f;master出现故障后&#xff0…

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

vue的生命周期和执行顺序

1&#xff0c;Vue 生命周期都有哪些&#xff1f; 序号生命周期描述1beforecreate创建前vue实例初始化阶段&#xff0c;不可以访问data,methods&#xff1b; 此时打印出的this是undefined&#xff1b;2created创建后vue实例初始化完成&#xff0c;可以访问data&#xff0c;meth…

truffle 进行智能合约测试

0字 本方法使用了可视化软件Ganache 前两步与不使用可视化工具的步骤是一样的&#xff08;有道云笔记&#xff09;&#xff0c;到第三步的时候需要注意&#xff1a; 在truffle插件下找到networks目录&#xff0c;提前打开Ganache软件 在Ganache中选择连接或者新建&#xff0…

Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;十一&#xff09;项目模块Projects序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue…

Redis : zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误&#xff1a;jemalloc/jemalloc.h&#xff1a;没有那个文件或目录 #include <jemalloc/jemalloc.h> 解决 : 如上图使用命令 make MALLOClibc

视频卡通化技术路线

神经风格迁移&#xff1a;用深度神经网络生成风格化图像&#xff0c;通过捕获到的图像中的内容表征对输出图像做约束&#xff0c;就是输入图像和目标图像通过vgg提取的特征做约束。 GAN图像翻译&#xff1a;Image-to-image translation&#xff0c;主要基于conditional GAN&am…

Redis分布式锁的演变历程

什么时候用分布式锁 当并发去读写一个【共享资源】的时候&#xff0c;我们为了保证数据的正确&#xff0c;需要控制同一时刻只有一个线程访问。 分布式锁就是用来控制同一时刻&#xff0c;只有一个 JVM 进程中的一个线程可以访问被保护的资源。 分布式锁入门 分布式锁应该满足…

【C++修炼之路】list 模拟实现

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、读源码二、成员三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、迭代器五、其他接口 如果无聊的话&#xff0c;…

RocketMQ环境搭建

环境搭建 环境准备 下载地址: https://downloads.apache.org/rocketmq/4.9.5/安装 上传至服务器 mkdir /usr/soft #上传至此目录/usr/softmkdir /usr/soft 解压 cd /usr/soft unzip rocketmq-all-4.9.5-bin-release.zip移动 mkdir /usr/local/rocketmq cd /usr/soft mv r…

Kubernetes - kubeadm部署

Kubernetes - kubeadm部署 1 环境准备1.1 在各个节点上配置主机名&#xff0c;并配置 Hosts 文件1.2 关闭防护墙&#xff0c;禁用selinux&#xff0c;关闭swap1.3 配置免密登录1.4 配置内核参数1.5 配置br_netfilter 2. 安装K8s2.1 安装docker(各节点)2.2 安装K8s组件(各节点)2…

安达发|如何选择更适合我们的APS高级排程软件

如何选择aps高级排程公司更适合我们?在选购aps高级排程的时候&#xff0c;一些朋友由于不清楚其中的选购技巧&#xff0c;许多时候会掉入些许选择误区&#xff0c;导致我们买不了合适我们选择的aps高级排程。因此选择适合我们的aps高级排程就变得十分重要&#xff0c;唯有明白…

使用typora+PicGo+Gitee简单实现图片上传功能

本文通过配置PicGoGitee来实现typora图片上传功能&#xff0c;系统是window 注意下载的清单有&#xff1a;PicGo&#xff0c;node.js&#xff0c;配置有&#xff1a;PicGo&#xff0c;node.js&#xff0c;gitee&#xff0c;typora 看着复杂实际上并不难&#xff0c;只是繁琐&am…

Django项目开发快速入门

Django项目开发快速入门 生成Django项目编写module后台管理系统admin自定义管理页面视图函数使用Django模板 生成Django项目 现在cmd中使用命令安装Django框架 pip install django3.2使用命令生成项目 django-admin startproject DjStore使用命令生成应用 python .\manage.…

学生成绩管理系统|Python小应用练习

题目要求 实现学生成绩管理系统 输入学生成绩信息序列&#xff0c;获得成绩从高到低、从低到高、按某一门成绩的排列,相同成绩都按先录入排列在前的规则处理。 数据如下&#xff1a;(数据规则&#xff1a;学生姓名 高数成绩 英语成绩 大物成绩) SanZhang 70 80 61 SiLi 86 77 …

CS 144 Lab Zero -- 可靠的内存字节流

CS 144 Lab Zero -- 可靠的内存字节流 环境搭建使用socket写一个网络程序In-memory reliable byte stream 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 0 对应的PDF: Lab Checkpoint 0: networking warmup Lab 0 会省去Telnet部分内容。 环境搭建 Run Ubuntu ver…

golang 日志库logrus实践

logrus完全兼容标准的log库&#xff0c;还支持文本、JSON 两种日志输出格式。很多知名的开源项目都使用了这个库&#xff0c;如大名鼎鼎的 docker。 快速使用 第三方库需要先安装&#xff1a; $ go get github.com/sirupsen/logrus 后使用&#xff1a; package mainimport (&qu…