Python 3.x 合并两个数据帧,并在由管道分隔的列中输入匹配的条目

Python 3.x 合并两个数据帧,并在由管道分隔的列中输入匹配的条目,python-3.x,pandas,dataframe,match,delimiter,Python 3.x,Pandas,Dataframe,Match,Delimiter,我有两个大熊猫数据框变体和表型当在列基因上的数据框之间映射时,它应该用一个新列HP-ID打印所有行变体数据框,并用管道分隔。下面是数据帧的几行 导入熊猫 #变体 数据变量={'CHROM':['Chr1','Chr11'],'START':[5193727356867846],'GENE':['KCNJ1','NPHS2'],'REF':['C','G'],'ALT':['T','A']} 变量=pd.DataFrame(数据变量) CHROM起始基因REF-ALT 0 Chr1 5193727

我有两个大熊猫数据框
变体
表型
当在列
基因
上的数据框之间映射时,它应该用一个新列
HP-ID
打印所有行变体数据框,并用
管道
分隔。下面是数据帧的几行

导入熊猫
#变体
数据变量={'CHROM':['Chr1','Chr11'],'START':[5193727356867846],'GENE':['KCNJ1','NPHS2'],'REF':['C','G'],'ALT':['T','A']}
变量=pd.DataFrame(数据变量)
CHROM起始基因REF-ALT
0 Chr1 51937273 KCNJ1 C T
1 Chr11 56867846 NPHS2 G A
#表型
数据_phe={'entrez-id':[37583758375837583758782778277827],
‘基因’:[‘KCNJ1’、‘KCNJ1’、‘KCNJ1’、‘KCNJ1’、‘KCNJ1’、‘NPHS2’、‘NPHS2’、‘NPHS2’、‘NPHS2’],
‘HP-ID’:[‘HP:0002013’、‘HP:0002007’、‘HP:0001561’、‘HP:0000256’、‘HP:0001508’、‘HP:0003774’、‘HP:0003678’、‘HP:0000093’、‘HP:0003073’],
‘表型’:[‘呕吐’、‘额头浮肿’、‘羊水过多’、‘大头症’、‘发育不全’、‘5期慢性肾病’、‘快速进展’、‘蛋白尿’、‘低蛋白血症’]
表型=pd.数据帧(数据)
entrez-id基因HP-id表型
0 3758 KCNJ1马力:0002013
13758 KCNJ1马力:0002007正面波幅
23758 KCNJ1 HP:0001561羊水过多
33758 KCNJ1 HP:0000256大头畸形
43758 KCNJ1 HP:0001508未能茁壮成长
57827 NPHS2 HP:0003774第5期慢性肾病
67827 NPHS2 HP:0003678快速递增
77827 NPHS2 HP:0000093蛋白尿
87827 NPHS2 HP:0003073低蛋白血症
所需输出

CHROM  START  GENE  REF  ALT  HP-ID
Chr1  51937273  KCNJ1  C  T  HP:0002013|HP:0002007|HP:0001561|HP:0000256|HP:0001508
Chr6  56867846  NPHS2  G  A  HP:0003774|HP:0003678|HP:0000093|HP:0003073
我累了什么

data_frames = [variants, phenotype]
df_marged = reduce(lambda left,right: pd.merge(left,right,on=['GENE'],how='outer'), data_frames)

当一行与另一行相匹配时,这将打印所有的变体行和表型行。

首先聚合
join
by,然后使用:


谢谢您的回答,我需要一些帮助,对您的解决方案进行一些小的更改。如果没有匹配(表型中缺少数据),则应为NA或空白。不应删除变量数据框中的条目。感谢you@Luffy-所以你需要左连接-
变体.merge(表型.groupby('GENE')['HP-ID']].agg('HP-ID''.join.).reset_index(),on='GENE',how='left')
variants.merge(phenotype.groupby('GENE')['HP-ID'].agg('|'.join).reset_index(), on='GENE')