让我们一起—merge

本文介绍了Stata中的merge命令,用于合并不同数据集。内容涵盖了一对一、多对一、一对多和多对多的合并方式,以及noreport、generate、update、replace、assert和keep等选项的使用,帮助读者理解如何根据需求进行数据合并并处理合并结果。

小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴" 点击 " 即可领取

1,导读

在我们的日常生活中经常会见到各种各样的表格,这些表格包含不同的信息。比如一个班主任,他有一个关于学生信息的表格,包括学生姓名,年龄等信息,各位任课老师也有这个班级学生的各科成绩。如果我们想进一步了解这个班级学生的信息,那么就会考虑把这些表格进行横向合并,这时就要用到我们今天介绍的命令—merge

2,命令介绍

merge是将来自当前内存中的数据集(master dataset)的相应观察值与来自外部的数据集(using dataset)的观察值按照指定的关键变量进行横向拼接,具体有以下几种形式。

merge 1:1 varlist using filename [, options]

对指定的关键变量进行一对一的合并

merge m:1 varlist using filename [, options]

对指定的关键变量进行多对一的合并

merge 1:m varlist using filename [, options]

对指定的关键变量进行一对多的合并

merge m:m varlist using filename [, options]

对指定的关键变量进行多对多的合并

merge 1:1 _n using filename [, options]

通过观察值进行一对一的合并

注意:此处的"多"和"一"是指指定的关键变量再不同数据集中所对应的观察值。

3.选项介绍

merge的选项比较多,在此处我们结合例子介绍一些比较常用的选项,主要选项有以下几个:

(1),keepusing(varlist) :用来保留合并时using dataset中的部分变量,默认保留全部。

(2),generate(newvar):产生一个新的用来标记合并结果的变量,默认情况下是_merge

(3),nogenerate :不产生用来标记合并结果的变量。

(4),noreport :不显示匹配结果表。

(5),update :使用using dataset中变量的值更新master dataset中同名变量的缺失值,master dataset中的非缺失值不变。

(6),replace :使用using dataset中变量的非缺失值代替master dataset中同名变量的值,using dataset中的缺失值对应的master dataset中的同名变量值不变。此选项要和update一起使用。

(7),force :强制字符串/数字变量类型匹配而不会出错。

(8),keep(results) :指定要保留的匹配结果。

(9),assert(results) :指定执行所需的匹配结果。

首先我们先用input输入两个数值变量类型,并将数据保存起来以备调用,命令如下:

clear all
cap mkdir d:/merge
cd d:/merge
input id x1 x2 x3 x4
1 0 1 1 4
2 1 1 2 2
3 1 . 3 2
4 . 3 5 1
10 2 4 3 5
end
save example1,replace
clear
input id x1 x2
1 0 1
1 . 1
2 1 3
2 2 .
3 2 4
4 1 .
4 2 3
20 2 4
end
save example2,replace

example2master dataest,example1using dataset,可以观察到以id为关键变量进行合并是一个m:1的合并,先看一下默认情况下的合并情况:

use example2,clear
merge m:1 id using example1
list,sepby(id) //在不同的id之间用横线分隔,便于观察

在这里插入图片描述

在这里插入图片描述

结果分为两部分,第一部分为匹配结果表,它展示了匹配结果的总体情况。从表中可以看出匹配成功的有七个观察值,匹配成功的标记即为_merge=3;没有匹配成功的有两个观察值,结果分别为_merge=1(数据仅仅来自master data)和_merge=2(数据仅仅来自using data)。第二部分是把匹配结果展示出来,从中可以看到合并时默认保留了example1中所有变量的值,且在两个数据集都有相同变量时(如x1x2),结果会以master data中的为主。

3.1 noreport

使用noreport选项时,就会把默认情况下的第一部分省略,只剩第二部分的结果。

use example2,clear
merge m:1 id using example1,noreport
list,sepby(id)

在这里插入图片描述

3.2 generate,nogenerate

使用这两个选项可以改变标记合并结果的变量

use example2,clear
merge m:1 id using example1,keepusing(x3) nogenerate
list,sepby(id)

在这里插入图片描述

在上述命令中我们还使用了keepusing(x3),可以看到在进行两个数据集的合并时,只保留了example1x3变量,并且只有合并后的数据,没有标记变量。

use example2,clear
merge m:1 id using example1,keepusing(x3) generate(type)
list,sepby(id)

在这里插入图片描述

使用generate(type)产生一个用来标记合并结果的新变量type

3.3 update replace

使用这两个选项更新缺失值

use example2,clear
merge m:1 id using example1,update
list,sepby(id)

在这里插入图片描述

可以观察到原本example2x1x2中缺失值都由example1中的同样变量相应值进行了更新。除此之外,标记合并结果的变量除了之前的1、2、3的值外,有了4和5这两个值。其中_merge=4代表至少一个缺失值被更新,没有与using data(此处为example1)冲突的非缺失值;_merge=5代表其中至少一个重叠变量的值有和using data(此处为example1)冲突的非缺失值。

use example2,clear
merge m:1 id using example1,update replace
list,sepby(id)

在这里插入图片描述

当同时使用updatereplace时,会发现example2maser data)的重叠变量的值全部由example1中的值来代替,在example1using data)中重叠变量有缺失值除外。

3.4 assert,keep

使用这两个选项可以指定合并结果

use example2,clear
merge m:1 id using example1,assert(3)
list,sepby(id)

在这里插入图片描述

这时系统会报错,因为我们事先要求进行两个数据集的完全匹配,也就是以_merge=3的形式进行合并,但并不是所有的观察值都符合这种匹配方式的,所以会报错。这时可以去数据集看一下,和默认结果并没有什么不同,但不会展示。

在这里插入图片描述

use example2,clear
merge m:1 id using example1,keep(3)
list,sepby(id)

在这里插入图片描述

当使用keep()选项时要求为先进行默认的合并,然后保留_merge=3的结果,如图所示,只保留了我们想要的结果。

以上就是小编今天为大家带来的内容,小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴" 点击 " 即可领取

<think>我们面对的问题是如何高效地合并两个大型DataFrame。根据之前的引用,我们知道Pandas提供了多种合并方法,包括`concat`、`merge`和`join`。由于用户强调数据量较大,因此我们需要考虑内存和性能问题。 ### 大型DataFrame合并策略 #### 📌 1. 使用`merge`进行键值合并(最常用) 适用于两个DataFrame有共同列(键)的情况,通过键将数据关联起来。 ```python import pandas as pd # 假设df1和df2都是大型DataFrame,它们有一个共同的列'key' merged_df = pd.merge( left=df1, right=df2, on='key', # 连接的键 how='inner', # 合并方式:inner, left, right, outer suffixes=('_left', '_right') # 重复列的后缀 ) ``` **参数说明**: - `how`: 合并方式,根据需求选择: - `'inner'`:只保留两个DataFrame都有的键(内连接)[^2] - `'left'`:保留左边DataFrame的所有键(左连接)[^3] - `'right'`:保留右边DataFrame的所有键 - `'outer'`:保留所有键(全外连接) - `suffixes`: 当两个DataFrame有相同列名(非连接键)时,添加后缀区分 **性能优化技巧**: - 如果键列不是索引,**先将其设为索引**可提升速度: ```python merged_df = pd.merge( df1.set_index('key'), df2.set_index('key'), left_index=True, right_index=True, how='inner' ) ``` - 使用`dask`库处理超大数据(内存不足时)[^1] #### 📌 2. 使用`concat`进行轴向堆叠 适用于两个DataFrame结构相同(列名一致)的情况,只需简单堆叠: ```python # 垂直堆叠(沿行方向,上下合并) result = pd.concat([df1, df2], axis=0) # 水平堆叠(沿列方向,左右合并) result = pd.concat([df1, df2], axis=1) ``` **注意**: - `axis=0`(默认)时要求列名相同,否则会产生NaN值 - `axis=1`时要求行索引对齐,否则同样会产生NaN #### 📌 3. 使用`join`基于索引合并 适用于两个DataFrame具有相同或可对齐的索引: ```python # 将df2合并到df1上(按索引对齐) result = df1.join(df2, how='left') ``` ### ⚡ 大型数据合并的性能优化 当处理**GB级数据**时,常规合并可能耗尽内存。以下方法可避免内存溢出: | 方法 | 适用场景 | 代码示例 | |------|----------|----------| | **分块合并** | 数据可分批处理 | `pd.concat([chunk.merge(df2) for chunk in pd.read_csv('big.csv', chunksize=10000)])` | | **使用Dask** | 分布式计算 | `import dask.dataframe as dd; ddf1 = dd.from_pandas(df1, npartitions=10); ddf2 = dd.from_pandas(df2, npartitions=10); merged_ddf = ddf1.merge(ddf2)` | | **优化数据类型** | 减少内存占用 | `df['col'] = df['col'].astype('category')` | | **过滤无用列** | 提前删除不需要的列 | `df1 = df1[['key','value']]` | ### ❌ 常见错误规避 1. **键值不唯一导致数据膨胀**: - 合并前检查键的唯一性: ```python print(df1['key'].nunique(), len(df1)) # 如果nunique < len,则有重复键 ``` 2. **内存溢出(OOM)**: - 使用`engine='pyarrow'`(Pandas 2.0+)加速处理[^3]: ```python pd.merge(..., engine='pyarrow') ``` ### 性能对比(模拟测试数据) | 方法 | 100万行数据合并时间 | 内存占用 | |------|---------------------|----------| | 常规`merge` | 5.2秒 | 1.2GB | | 设置索引后`merge` | 3.8秒 | 1.1GB | | Dask分布式 | 2.1秒(8核) | 分段内存 | §§相关问题§§ 1. 如何处理合并后的重复列名? 2. 当两个DataFrame的键列名称不同时如何合并? 3. 如何合并多个(>2)DataFrame? 4. 合并时出现内存错误(MemoryError)有哪些解决方案? </think>针对合并两个大型
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值