如何根据匹配模式合并/联接两个数据帧中的多列



我想基于染色体列中的相似模式合并两个数据帧。我用R&BASH,例如用";data.table"tidyverse"&merge((。有人能帮我提供R、BASH、Python、Perl等替代解决方案来解决这个问题吗?我想根据染色体信息进行合并,并保留两个计数/RXN。

注意:这两个DF没有对齐,我也很好奇如果缺少一些值会发生什么。

感谢和欢呼:

DF1:

Chromosome;RXN;ID
1009250;q9hxn4;NA
1010820;p16256;NA
31783;p16588;"PNTOt4;PNTOt4pp"
203;3-DEHYDROQUINATE-DEHYDRATASE-RXN;"DHQTi;DQDH"

DF2:

Chromosome;Count1;Count2;Count3;Count4;Count5
203;1;31;1;0;0;0
1010820;152;7;0;11;4
1009250;5;0;0;17;0
31783;1;0;0;0;0;0

预期结果:

Chromosome;RXN;Count1;Count2;Count3;Count4;Count5
1009250;q9hxn4;5;0;0;17;0
1010820;p16256;152;7;0;11;4
31783;p16588;1;0;0;0;0
203;3-DEHYDROQUINATE-DEHYDRATASE-RXN;1;31;1;0;0;0

正如正文中提到的bash,我为您提供了一个awk解决方案。数据帧位于文件df1df2:中

$ awk '
BEGIN {
FS=OFS=";"         # input and output field delimiters
}
NR==FNR {              # process df1
a[$1]=$2           # hash to an array, 1st is the key, 2nd the value
next               # process next record
}
{                      # process df2
$2=(a[$1] OFS $2)  # prepend RXN field to 2nd field of df2
}1' df1 df2            # 1 is output command, mind the file order

最后两行可以写得更清楚:

...
{
print $1,a[$1],$2,$3,$4,$5,$6
}' df1 df2

输出:

Chromosome;RXN;Count1;Count2;Count3;Count4;Count5
203;3-DEHYDROQUINATE-DEHYDRATASE-RXN;1;31;1;0;0;0
1010820;p16256;152;7;0;11;4
1009250;q9hxn4;5;0;0;17;0
31783;p16588;1;0;0;0;0;0

输出将按照df2的顺序。存在于df1中但不存在于df2中的染色体将不包括在内。df2中的染色体而不是df1中的染色体将从具有空RXN场的df2输出。此外,如果df1中有重复的染色体,则使用最后一条。如果这是一个问题,可以修复。

如果我正确理解您的请求,这应该在Python中完成。我已经将染色体列放入每个DataFrame的索引中。

from io import StringIO
txt1 = '''Chromosome;RXN;ID
1009250;q9hxn4;NA
1010820;p16256;NA
31783;p16588;"PNTOt4;PNTOt4pp"
203;3-DEHYDROQUINATE-DEHYDRATASE-RXN;"DHQTi;DQDH"'''
txt2 = """Chromosome;Count1;Count2;Count3;Count4;Count5;Count6
203;1;31;1;0;0;0
1010820;152;7;0;11;4
1009250;5;0;0;17;0
31783;1;0;0;0;0;0"""
df1 = pd.read_csv(
StringIO(txt1),
sep=';',
index_col=0,
header=0
)
df2 = pd.read_csv(
StringIO(txt2),
sep=';',
index_col=0,
header=0
)
DF1:
RXN               ID
Chromosome
1009250                               q9hxn4              NaN
1010820                               p16256              NaN
31783                                 p16588  PNTOt4;PNTOt4pp
203         3-DEHYDROQUINATE-DEHYDRATASE-RXN       DHQTi;DQDH
DF2:
Count1  Count2  Count3  Count4  Count5  Count6
Chromosome
203              1      31       1       0       0     0.0
1010820        152       7       0      11       4     NaN
1009250          5       0       0      17       0     NaN
31783            1       0       0       0       0     0.0
result = pd.concat(
[df1.sort_index(), df2.sort_index()],
axis=1
)
print(result)
RXN               ID  Count1  Count2  Count3  Count4  Count5  Count6
Chromosome
203         3-DEHYDROQUINATE-DEHYDRATASE-RXN       DHQTi;DQDH       1      31       1       0       0     0.0
31783                                 p16588  PNTOt4;PNTOt4pp       1       0       0       0       0     0.0
1009250                               q9hxn4              NaN       5       0       0      17       0     NaN
1010820                               p16256              NaN     152       7       0      11       4     NaN

concat命令还通过简单地为例如df1中的列填充NaN值来处理不匹配的索引,如果df2没有相同的索引,反之亦然。

最新更新