pandas---数据合并(concat、append、merge)

news/2024/7/5 1:35:07

1. concat函数

pd.concat([data1, data2], axis=1)

按照行或列进行合并,axis=0为列索引,axis=1为行索引。

df1 = make_df([1, 2], ['A', 'B'])
df2 = make_df([3, 4], ['A', 'B'])
display(df1, df2)
# 默认上下合并,垂直合并
pd.concat([df1, df2])  
# 左右合并,水平合并
pd.concat([df1, df2], axis=1)  

# 忽略行索引:重置索引
pd.concat([df1, df2], ignore_index=True)
# 使用多层索引 keys
pd.concat([df1, df2], keys=['x', 'y'])
pd.concat([df1, df2], keys=['x', 'y'], axis=1)

不匹配级联指的是级联的维度的索引不一致。例如纵向级联时列索引不一致,横向级联时行索引不

一致。对应索引没有值,会自动用NaN填充。

外连接:类似并集,显示所有数据,补NaN(默认模式)。

内连接: 类似交集, 只显示共同的部分,只连接匹配的项。

pd.concat([df3, df4])
pd.concat([df3, df4], join='outer')
pd.concat([df3, df4], join='inner')

 2. append函数

display(df3, df4)
df3.append(df4)

3. merge函数

类似MySQL中表和表直接的合并;

merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并;

使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并;

每一列元素的顺序不要求一致。

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

 

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

 

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

 

key的规范化:

使用on=显式指定哪一列为key,当2个DataFrame有多列相同时使用:

df1 = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['张三', '李四', '王五'],
    'age': [22, 33, 44]
})
df2 = pd.DataFrame({
    'id': [2, 3, 4],
    'name': ['王五', '女', '男'],
    'job': ['Saler', 'CEO', 'Programer']
})
display(df1, df2)
# 如果有多列名称相同,需要指定一列作为连接的字段
# df1.merge(df2, on='id')
df1.merge(df2, on='name')

 

使用left_on和right_on指定左右两边的列作为key,当左右两边的key都不相等时使用:

# 如果没有相同的列名,则需要使用left_on,right_on来分别指定2个表中的不同列作为连接的字段
df1.merge(df2, left_on='id', right_on='id2')

当左边的列和右边的index相同的时候,使用right_index=True:

# 可以使用行索引作为连接的字段
df1.merge(df2, left_index=True, right_index=True)
df1.merge(df2, left_index=True, right_on='id2')

内合并:只保留两者都有的key(默认模式);

外合并 how='outer':补NaN;

左合并、右合并:how='left',how='right'。

# 外连接 : 会显示2个表的所有数据
df1.merge(df2, how='outer')
# 左连接: 显示左边df1表的所有数据和右边表df2的公共数据
df1.merge(df2, how='left')
# 右连接: 显示右边df2表的所有数据和左边表df1的公共数据
df1.merge(df2, how='right')

列冲突的解决:

即有多个列名称相同时,需要使用on=来指定哪一个列作为key,配合suffixes指定冲突列名,

可以使用suffixes=自己指定后缀。

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

 

总结:

合并有三种现象: 一对一、多对一、多对多;

合并默认会找相同的列名进行合并,如果有多个列名相同,用on来指定;

如果没有列名相同,但是数据又相同,可以通过left_on、right_on来分别指定要合并的列;

如果想和index合并,使用left_index, right_index来指定;

如果多个列相同,合并之后可以通过suffixes来区分;

还可以通过how来控制合并的结果,默认是内合并,还有外合并outer,左合并left,右合并right。

 

 

 

 

 

 

 

 

 

 


http://lihuaxi.xjx100.cn/news/1241529.html

相关文章

RabbitMq消息堆积问题及惰性队列

消息堆积问题 当生产者发送消息的速度超过了消费者处理的速度,就会导致队列的消息堆积,知道队列存储消息达到上限。最早接受的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。 解决消费对接问题 1.增加更多的消…

希尔贝壳邀您参加2023深圳国际人工智能展览会

2023深圳国际人工智能展览会“AIE”将于2023年5月16-18日在深圳国际会展中心 (宝安)举办,希尔贝壳受邀参加,展位号:A331。 伴随着智能行业的快速发展,展会已被越来越多的企业列入每年必选展会,也成为各采购商选购的理…

Android-MTK平台功能需求解决:客户电池NTC功能(高低温报警功能)--第2天分析与解决

一、进一步修改代码内容-过程 今日了解到,昨日所修改的kernel层的mtk_charger.h文件位于A13部分,然6769平台A13部分的kernel层不参与编译,那么修改后再编译等等后续操作验证结果自然无效,参与编译kernel层是A12部分的kernel-4.19…

springcloud 父项目建立(一)

我们开发项目,现在基本都用到maven,以及用父子项目,以及公共模块依赖,来构建方便扩展的项目体系; 首先我们建立父项目 microservice ,主要是一个pom,管理module,以及管理依赖&#x…

是德DSOX3014T MSOX3014T数字逻辑示波器

概述: keysight是德DSOX3014T MSOX3014T数字逻辑示波器8.5 英寸电容触摸屏让操作和归档变得更加简单,可以加速您的测试,独有的区域触控触发技术支持您在几秒钟内轻松隔离信号,独有的区域触控触发技术支持您在几秒钟内轻松隔…

面向对象练习(3)

封装与继承 目录 1.使用封装实现企鹅类 2.选民投票 3.使用继承实现电子宠物系统 4.游戏开发-面向对象 5.信息输出-面向对象 6.电子宠物系统 7.程序分析 1.使用封装实现企鹅类 package dh03;/*** * author XXX 保证健康值的有效性(0-100)&#xf…

云服务器上使用Docker Compose创建Redis三主三从集群

一、环境 云服务器Ubuntu20.4Dokcer 24.0.2 二、步骤 目录结构是这样: 绿色的目录是用来存储容器中的文件,不需要我们手动创建,将路径配置在配置文件中即可。黑色的目录和文件需要自己手动创建。 我们一共创建7个容器: redis…

java基础(多线程)-常用方法具体使用

一、Thread.start()方法 start()方法:启动子线程 new Thread();当前线程的状态为NEW 调用start()方法之后当前线程的状态变为RUNNABLE 二、Thread.sleep()静态方法 1. 调用sleep会让当前线程从Running进入Timed Waiting 状态 2.其他线程可以使用interrupt方法…