【Pandas】pd.concat和pd.merge的区别

前言

最近做了一个数据挖掘的项目,里面涉及到大量dataframe拼接的操作。在这个过程中,我主要使用过两种拼接方法:pd.mergepd.concat。其中遇到过一些坑,在这里记录一下。

简介

首先给出pandas官方文档对于这两种方法的介绍:

pd.merge

Merge DataFrame or named Series objects with a database-style join.

A named Series object is treated as a DataFrame with a single named column.

The join is done on columns or indexes. If joining columns on columns, the DataFrame indexes will be ignored. Otherwise if joining indexes on indexes or indexes on a column or columns, the index will be passed on. When performing a cross merge, no column specifications to merge on are allowed.

pd.concat

Concatenate pandas objects along a particular axis.

Allows optional set logic along the other axes.

Can also add a layer of hierarchical indexing on the concatenation axis, which may be useful if the labels are the same (or overlapping) on the passed axis number.

可以看出:

  • pd.merge是一个类似于database join的方法,和SQL用起来基本没啥区别,也是有内连接、外连接之类的这些概念
  • pd.concat可以指定轴,也就是说既可以横向拼接,又可以纵向拼接。

基本用法

pd.merge

将两个表按照name字段做pd.merge操作。

import pandas as pddf1 = pd.DataFrame([['a', 1],['b', 2],['c', 3],],columns=['name', 'score1'],
)
df2 = pd.DataFrame([['a', 1],['b', 2],['d', 4],],columns=['name', 'score2'],
)result_list = {'inner': pd.merge(left=df1, right=df2, how='inner', on='name'),  # 取name的交集'outer': pd.merge(left=df1, right=df2, how='outer', on='name'),  # 取name的并集'left': pd.merge(left=df1, right=df2, how='left', on='name'),  # 取左边表的name'right': pd.merge(left=df1, right=df2, how='right', on='name'),  # 取右边表的name
}for merge_type, df in result_list.items():print(merge_type)print(df)

输出结果:

innername  score1  score2
0    a       1       1
1    b       2       2
outername  score1  score2
0    a     1.0     1.0
1    b     2.0     2.0
2    c     3.0     NaN
3    d     NaN     4.0
leftname  score1  score2
0    a       1     1.0
1    b       2     2.0
2    c       3     NaN
rightname  score1  score2
0    a     1.0       1
1    b     2.0       2
2    d     NaN       4

其中缺失值会置为NaN。

pd.concat

import pandas as pddf1 = pd.DataFrame([['a', 1],['b', 2],['c', 3],],columns=['name', 'score1'],
)
df2 = pd.DataFrame([['a', 1],['b', 2],['d', 4],],columns=['name', 'score2'],
)result_list = {'axis=0': pd.concat([df1, df2], axis=0),'axis=1': pd.concat([df1, df2], axis=1),
}for merge_type, df in result_list.items():print(merge_type)print(df)

输出结果:

axis=0name  score1  score2
0    a     1.0     NaN
1    b     2.0     NaN
2    c     3.0     NaN
0    a     NaN     1.0
1    b     NaN     2.0
2    d     NaN     4.0
axis=1name  score1 name  score2
0    a       1    a       1
1    b       2    b       2
2    c       3    d       4

同样的,缺失值会用NaN填充。

遇到的坑

index或者column被修改

如果合并的两个dataframe中除了name还有名字相同的列,那么:

  • pd.merge会默认将column重新命名(加上后缀)
  • pd.concat只是简单的做拼接,不会对index或者column重新命名,进而会导致合并后有重复的index或者column

例子如下:

import pandas as pddf1 = pd.DataFrame([['a', 1],['b', 2],['c', 3],],columns=['name', 'score'],
)
df2 = pd.DataFrame([['a', 1],['b', 2],['d', 4],],columns=['name', 'score'],
)result_list = {'inner': pd.merge(left=df1, right=df2, how='inner', on='name'),'axis=0': pd.concat([df1, df2], axis=0),'axis=1': pd.concat([df1, df2], axis=1),
}for merge_type, df in result_list.items():print(merge_type)print(df)

输出结果:

innername  score_x  score_y
0    a        1        1
1    b        2        2
axis=0name  score
0    a      1
1    b      2
2    c      3
0    a      1
1    b      2
2    d      4
axis=1name  score name  score
0    a      1    a      1
1    b      2    b      2
2    c      3    d      4

index是否相同对于合并的影响

如果合并的两个dataframe的index不相同,那么:

  • pd.merge是没有影响的,因为pd.merge本身是基于column进行合并的,并且通过on参数去指定根据哪个column进行合并。并且,合并之后的index默认是从0开始,以1为公差的等差数列
  • 而对于pd.concat来说,在横向拼接(pd.concat(axis=1))的时候,index会变成两个dataframe的index的并集,同时出现的缺失值会用NaN填充

例子如下:

import pandas as pddf1 = pd.DataFrame([['a', 1],['b', 2],['c', 3],],columns=['name', 'score'],index=[0, 1, 'xxx'],
)
df2 = pd.DataFrame([['a', 1],['b', 2],['d', 4],],columns=['name', 'score'],index=[0, 1, 'yyy'],
)result_list = {'inner': pd.merge(left=df1, right=df2, how='inner', on='name'),'axis=0': pd.concat([df1, df2], axis=0),'axis=1': pd.concat([df1, df2], axis=1),
}for merge_type, df in result_list.items():print(merge_type)print(df)

输出结果:

innername  score_x  score_y
0    a        1        1
1    b        2        2
axis=0name  score
0      a      1
1      b      2
xxx    c      3
0      a      1
1      b      2
yyy    d      4
axis=1name  score name  score
0      a    1.0    a    1.0
1      b    2.0    b    2.0
xxx    c    3.0  NaN    NaN
yyy  NaN    NaN    d    4.0

总结

pd.mergepd.concat
作用的对象两个dataframe多个dataframe
拼接的方式通过指定列名按照类似数据库join的方式进行拼接简单的横向拼接、纵向拼接
index是否相同对于合并是否有影响
拼接结果的区别1. index会默认从0开始编号
2. column可能会被加上后缀(当两个dataframe有相同列名时)
1. index和column的名字不会被修改
2. 可能会出现重复index或重复column(两个dataframe中有同名的index或者column)
3. 横向拼接的时候行数可能会变(两个dataframe中有同名的index)

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

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

相关文章

Mysql基础2-多表查询和视图

约束 完整性约束 为防止不规范数据进入数据库中,在用户对数据进行插入,修改,删除操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件 约束条件约束描述PRIMARY KEY主键约束NOT NULL非空约束,字段不…

解决oracle的em访问提示“使用不受支持的协议。”的bug

1. 设置oracle唯一名称 执行emctl时需要设置一个唯一的名称 否则提示 “Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name. ”中文意思为“未定义环境变量ORACLE_UNQNAME。 请将ORACLE_UNQNAME设置为数据库唯一名称/服务…

微服务-Nacos(注册中心)

Nacos是SpringCloud的一个功能非常强大的组件,想比eureka的功能更加丰富 官方的nacos简介 Nacos(全称:Naming and Configuration Service)是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并贡献给开源…

tensorflow 模型计算中,预测错误;权重参数加载

tensorflow 模型计算中,预测错误;权重参数加载 tensorflow 模型计算主要代码(正确代码) linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的…

设置Linux 静态IP

LInux虚拟机默认的IP地址是动态获取的 作为服务器,我们一般还需要把IP地址设置为静态的 设置静态IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno # BOOTPROTOdhcp 动态获取 BOOTPROTOstatic IPADDR"192.16…

vue 重写数组的七个方法

一、为什么要重写数组方法? Vue 为了实现响应式数据绑定,需要能够捕获到数据的变化,以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型,所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 O…

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

C++ string类详解

⭐️ string string 是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本一致&#xff0c;还有一些额外的操作 string 的常规操作&#xff0c;在使用 string 类时&#xff0c;需要使用 #include <string> 以及 using namespace std;。 ✨ 帮助文档&…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

【引言】 “JS卡片支持为组件设置action&#xff0c;包括router事件和message事件&#xff0c;其中router事件用于应用跳。若设置router事件&#xff0c;则action属性值为"router"&#xff1b;abilityName为卡片提供方应用的跳转目标Ability名&#xff1b;params中的…

基于java民宿管理系统设计与实现

摘 要 伴随着我国旅游业的快速发展&#xff0c;民宿已成为最受欢迎的住宿方式之一。民宿借助互联网和移动设备的发展&#xff0c;展现出强大的生命力和市场潜力。民宿主要通过各种平台如携程、去哪儿、淘宝等在网络上销售线下住宿服务&#xff0c;同时民宿经营者也需要从网络上…

Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

Spring Security 在最近几个版本中配置的写法都有一些变化&#xff0c;很多常见的方法都废弃了&#xff0c;并且将在未来的 Spring Security7 中移除&#xff0c;因此又补充了一些新的内容&#xff0c;重新发一下&#xff0c;供各位使用 Spring Security 的小伙伴们参考。 接下…

模板编程-成员特化

成员特化:类模板特化除了可以对整个类进行特化外,可以只针对某部分成员函数进行特化 全类特化和成员特化都属于全局特化 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring>template<typename T> class CMath { public:CMath(const…

文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…

LeetCode--HOT100题(33)

目录 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 LeetCode做题链接&#xff1…

VR/AR眼镜方案,MTK联发科平台智能眼镜安卓主板设计方案

随着人工智能在不同领域的逐渐深入&#xff0c;人们对一款产品的需求不再局限于某种单一的功能或单一场景&#xff0c;尤其是在工业医疗等专业领域&#xff0c;加快数字化转型才能实现产业的升级。 AR智能眼镜&#xff0c;是一个可以让现场作业更智能的综合管控设备。采用移动…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

vscode搭建java开发环境

一、配置extensions环境变量VSCODE_EXTENSIONS 该环境变量路径下的存放安装组件&#xff1a; 二、setting配置文件 {"java.jdt.ls.java.home": "e:\\software\\jdk\\jdk17",// java运行环境"java.configuration.runtimes": [{"name":…

vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

vscode报错如下&#xff1a; 一、第一种情况 原因是本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方案就是把本地的known_hosts的原服务器信息全部删掉&#xff0c;然后重新连接。 二、第二种情况 在编写配置文件config时&…

批量提取文件名到excel,详细的提取步骤

如何批量提取文件名到excel&#xff1f;我们的电脑中可能存储着数量非常多的电子文件&#xff0c;现在需要快速将这些文件的名称全部提取到Excel中。虽然少量数据可以通过复制粘贴的方式轻松完成&#xff0c;但是对于上万个数据而言&#xff0c;复制粘贴都是行不通的&#xff0…