前言
数据处理中经常对多个表的数据进行合并处理,python 提供两个十分好用的函数处理。merge() 、 concat()
merger函数是Python里的数据分析工作中最常见的函数之一,主要应用场景是:针对同一个主键存在两张不同字段的表。(这里强调只能用于2张表的合并)
merge函数
简要的罗列函数的构成和参数的介绍
pd.merge(left: 'DataFrame | Series', # 参与合并的左侧DataFrame对象。
right: 'DataFrame | Series', # 参与合并的右侧DataFrame对象。
how: 'str' = 'inner', # 要执行的连接方式,可选{'left','right','outer','inner','cross'},默认为'inner'。
on: 'IndexLabel | None' = None, # 用于连接的列索引名称(即列标签名),该键必须存在于左右两个DataFrame中。若没有指定,则以列名的交集作为连接键。
left_on: 'IndexLabel | None' = None, # 指定左侧DataFrame中用于连接键的列名。
right_on: 'IndexLabel | None' = None, # 指定右侧DataFrame中用于连接键的列名。
left_index: 'bool' = False, # 使用左侧DataFrame中的行索引作为连接键;
right_index: 'bool' = False, # 使用右侧DataFrame中的行索引作为连接键;
sort: 'bool' = False, # DataFrame对象结果中,按词典顺序排序,默认False。
suffixes: 'Suffixes' = ('_x', '_y'), # 指定左右DataFrame存在相同列名时,为其添加后缀。
copy: 'bool' = True,
indicator: 'bool' = False, # 输出结果中添加_merge列,表明每一行使用的左右键来源情况。
validate: 'str | None' = None # 验证连接键在左侧、右侧或两侧是否唯一,即'1:1','1:m','m:1'。
)
函数应用示例
首先我有两张表,如下: 第一张表包含了:位点的位置信息、基因、外显子
panel_data = pd.read_csv("panel.bed", sep="\t")
panel.bed:
Chrom Start End Gene Exon
chr1 115252169 115252369 NRAS exon4
chr1 115256380 115256619 NRAS exon3
chr1 115258644 115258814 NRAS exon2
第二张表包含了:位点的位置信息、基因、转录本、染色臂
panel_exp_data = pd.read_csv("panel_exp.bed", sep="\t")
panel_exp.bed:
Chrom Start End Gene Transcript CytoBand
chr1 115252169 115252369 NRAS NM_002524.4 chr1:p13.2
chr1 115256380 115256619 NRAS NM_002524.4 chr1:p13.2
chr1 115256882 115256919 NRAS NM_002524.4 chr1:p13.2
chr2 29432621 29432778 ALK NM_004304.4 chr2:p23.2
需求:根据位点的位置信息, 将两个表合并。
最简单当然直接用默认值
默认值没有指定连接的列索引名称,以列名的交集作为连接键。两个表共同的键["Chrom", "Start", "End", ”Gene“]
data_meg = pd.merge(panel_data, panel_exp_data)
print(data_meg)
output:
Chrom Start End Gene Exon Transcript CytoBand
0 chr1 115252169 115252369 NRAS exon4 NM_002524.4 chr1:p13.2
1 chr1 115256380 115256619 NRAS exon3 NM_002524.4 chr1:p13.2
参数on
指定用于连接的列索引名称(即列标签名),该键必须存在于左右两个DataFrame中。若没有指定,则以列名的交集作为连接键。比如:on=["Chrom", "Start", "End"]
data_meg = pd.merge(panel_data, panel_exp_data, on=["Chrom", "Start", "End"])
print(data_meg)
output:
Chrom Start End Gene_x Exon Gene_y Transcript CytoBand
0 chr1 115252169 115252369 NRAS exon4 NRAS NM_002524.4 chr1:p13.2
1 chr1 115256380 115256619 NRAS exon3 NRAS NM_002524.4 chr1:p13.2
参数 how
指定要执行的连接方式,inner : 使用左右侧frame的键的交集;简单说,只输出两个表中共同有位点信息。
# how: 'str' = 'inner',
data_meg = pd.merge(panel_data, panel_exp_data)
data_meg_inner = pd.merge(panel_data, panel_exp_data,how='inner')
print(data_meg_inner)
output:
Chrom Start End Gene Exon Transcript CytoBand
0 chr1 115252169 115252369 NRAS exon4 NM_002524.4 chr1:p13.2
1 chr1 115256380 115256619 NRAS exon3 NM_002524.4 chr1:p13.2
参数 left_on,right_on
当左右两个frame的连接键的名字相同时,可以直接用参数‘on’。左侧frame键名为大写,,右侧frame键名是小写,名字不一样但其内容实质相同。此时就用left_on和right_on参数以替代参数on。
data_meg_inner = pd.merge(panel_data, panel_exp_data,how='inner', left_on=['Chrom', 'Start', 'End'], right_on=['chrom', 'start', 'end'])
print(data_meg_inner)
output:
Chrom Start End Gene_x Exon chrom start end Gene_y Transcript CytoBand
0 chr1 115252169 115252369 NRAS exon4 chr1 115252169 115252369 NRAS NM_002524.4 chr1:p13.2
1 chr1 115256380 115256619 NRAS exon3 chr1 115256380 115256619 NRAS NM_002524.4 chr1:p13.2
参数suffixes
当左右frame存在相同列名时(比如Gene),通过该参数为其添加后缀。_x和_y是默认后缀
data_meg_inner = pd.merge(panel_data, panel_exp_data,how='inner', left_on=['Chrom', 'Start', 'End'], right_on=['chrom', 'start', 'end'], suffixes=('_panel', '_panel_exp'))
print(data_meg_inner)
output:
Chrom Start End Gene_panel Exon chrom start end Gene_panel_exp Transcript CytoBand
0 chr1 115252169 115252369 NRAS exon4 chr1 115252169 115252369 NRAS NM_002524.4 chr1:p13.2
1 chr1 115256380 115256619 NRAS exon3 chr1 115256380 115256619 NRAS NM_002524.4 chr1:p13.2
更多完整内容阅读原文:1.Python高频函数—数据合并merge() https://mp.weixin.qq.com/s/ezatpufJPeMwd8s8vqcXCw