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

Language agnostic 如何根据匹配模式合并/连接两个数据帧中的多个列,language-agnostic,Language Agnostic,我想根据染色体列中的相似模式合并两个数据帧。我使用R&BASH进行了各种尝试,例如使用“data.table”“tidyverse”、&merge()。有人能帮我用R、BASH、Python、Perl等提供替代解决方案来解决这个问题吗?我想根据染色体信息合并并保留两个计数/RxN 注意:这两个DFs没有对齐,我也很好奇如果缺少一些值会发生什么 谢谢,干杯: DF1: DF2: 预期结果: Chromosome;RXN;Count1;Count2;Count3;Count4;Count5 1009

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

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

谢谢,干杯:

DF1:

DF2:

预期结果:

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

如果我正确理解了您的请求,那么应该用Python实现。我已经将染色体列放入每个数据帧的索引中

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
)

concat命令还处理不匹配的索引,如果df2没有相同的索引,则只需为df1中的列填充NaN值,反之亦然。

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

$ 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
中的染色体将从
df2
输出,RXN字段为空。此外,如果
df1
中存在重复染色体,则使用最后一条。如果这是一个问题,这是可以解决的。

因此
df1
中的
Chromosome1
应该与
df2
中的
Chromosome2
匹配?
Chromosome1
Chromosome2
在您的示例中没有匹配项。你想仅仅连接这两个表吗?你能更清楚地说明“相似的匹配模式”对于你的用例意味着什么吗?这听起来很主观,编程解决方案与客观定义配合得最好。这里的预期结果似乎取决于您提供的不同DF2数据,这将使我们无法测试任何潜在的解决方案。你能解决这个问题吗?谢谢大家的反馈。我调整了两个数据集并澄清了问题。我想匹配两个文件中的“染色体”列标题Hey@Nick,这对我来说是一个非常有用的开始。将“染色体”列作为每个DF的索引意味着什么?你是怎么做到的?我尝试了:
df1.set_index('chromose',inplace=True)
,但它没有提供我预期的结果。我仍然有两个带有“染色体”的独特列。再次感谢!非常感谢。我现在添加了代码,在其中加载数据并将染色体列设置为索引。我还添加了一列“Count6”,因为它似乎与当前的列数不匹配。感谢您指定如何将列设置为索引。但是,我使用的是两个大文件,而不是字符串。我继续遇到错误:
raise InvalidIndexError(pandas.errors.InvalidIndexError:Reindexing仅对唯一值的索引对象有效
我认为问题在于我在索引的行中有重复项,但它没有太大变化
df1=pd.read_csv('df1.csv',sep=';',Index_col=0,header=0)print(df1)df1.index df2=pd.read_csv('df1.csv',sep=';',index_col=0,header=0)print(df2)df2.index result=pd.concat([df1.sort_index(),df2.sort_index()],axis=1)#打印(结果)结果时出错。to_csv('test.csv',index=False)
听起来好像有重复的染色体条目。我建议您在这里检查其中一个答案:此解决方案非常优雅、干净,感谢您提出此解决方案。我花了几天时间尝试使用AWK,但无法找到它。您确实是一个BASH向导:d
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
$ 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