查找模式是否匹配,然后从另一列输出拆分数据 - $|$ 分隔符失败

Find if a pattern matches then outputting split data from another column - $|$ separator failure

作为较长代码的一部分,我在尝试执行以下操作时遇到了障碍: 我有一个包含 3 列的库:[ClusterID, Human, Mouse]

ClusterID   Human   Mouse
50  LongAUGORFlinc|3P|XLOC_076196|TCONS_00295623:0.269513|182AA|167AA|$|$linc|3P|XLOC_037932|TCONS_00153577:0.957089|101AA|56AA|$|$linc|3P|XLOC_048756|TCONS_00195334:1.35817|128AA|73AA|   linc|3P|XLOC_066319|TCONS_00127223:1.0925|85AA|41AA|$|$LongAUGORFEnsASCoding|3P|XLOC_104581|TCONS_00206607|Nr2f2:0.354897|174AA|162AA||RNACodeAS|HSS_32160_5.3E-14$HSS_32161_6.4E-9$HSS_32163_3.9E-11$HSS_32164_6.5E-6$HSS_32165_4.7E-6$HSS_32166_1.7E-7$HSS_32168_8.1E-6$HSS_32169_3.2E-8$|$LongAUGORFEnsASCoding|3P|XLOC_113060|TCONS_00223512|Sugp1:1.20904|141AA|141AA||RNACodeAS|NearGap
81  EnsASCoding|3P|XLOC_034831|TCONS_00142998:0.399276|92AA|83AA|$|$LongAUGORFlinc|3P|XLOC_033946|TCONS_00137705:0.986858|221AA|196AA|$|$EnsASCoding|3P|XLOC_000485|TCONS_00003136:0.4139|122AA|78AA||RNACodeAS|HSS_0_4.2E-9$HSS_1_4.5E-5$|$EnsASCoding|3P|XLOC_034831|TCONS_00142998:0.399276|92AA|83AA|   linc|3P|XLOC_104529|TCONS_00206387:0.585795|114AA|82AA|$|$EnsASCoding|3P|XLOC_082328|TCONS_00160013:0.608952|88AA|59AA||RNACodeAS|HSS_18226_2.7E-14$HSS_18230_7.0E-5$HSS_18231_3.8E-13$HSS_18232_1.4E-5$|$LongAUGORFEnsASCoding|3P|XLOC_097111|TCONS_00191837|Zfp422:0.683284|252AA|192AA||RNACodeAS|HSS_28462_1.1E-12$HSS_28463_1.0E-16
279 linc|3P|XLOC_067039|TCONS_00267121:3.78124|173AA|31AA|$|$linc|3P|XLOC_067039|TCONS_00267116:3.53265|56AA|54AA|$|$linc|3P|XLOC_067039|TCONS_00267119:0.429515|42AA|31AA|$|$inc|3P|XLOC_067039|TCONS_00267121:3.78124|173AA|31AA| LongAUGORFlinc|3P|XLOC_097853|TCONS_00194306|AB041803:0.416568|171AA|166AA|$|$LongAUGORFlinc|3P|XLOC_097853|TCONS_00194302|AB041803:0.682355|197AA|166AA|$|$LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA|

第 2 列和第 3 列的每个元素都被“$|$”分隔。但是,$|$ 之间可能存在冗余部分。例如,在 Human 列第 2 行中,以下表达式重复两次:

EnsASCoding|3P|XLOC_034831|TCONS_00142998:0.399276|92AA|83AA| 

重复两次。

我有一个包含 2 列的查询列表:[GeneID, XLOC_ID]:

GeneID  XLOC_ID
A   LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA|
B   linc|3P|XLOC_105908|TCONS_00210845:3.79119|120AA|90AA|
C   linc|3P|XLOC_082473|TCONS_00160364:0.170433|40AA|22AA|
D   LongAUGORFEnsASCoding|3P|XLOC_084529|TCONS_00166880:0.478235|183AA|171AA|
E   linc|3P|XLOC_043879|TCONS_00084901:2.01255|106AA|97AA|

查询列表的每一行元素都是唯一的。

我想查看查询列表的第二列,查看该值是否与库的 "Mouse" 列的任何“$|$”分隔元素匹配。如果是,则将 Library 的 'Human' 列拆分为“$|$”,然后输出每个查询 ID 和 $|$ 中的每个元素。

例如"GeneID"A的XLOC_ID是:LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA|

这是图书馆[第 3 行,鼠标栏] 的一部分。因此,我需要将第 3 行的 Human 列拆分为 $|$ 以在单独的行上输出每个列,例如结果为:

GeneID  XLOC_ID Human_ID
A   LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA| linc|3P|XLOC_067039|TCONS_00267121:3.78124|173AA|31AA|
A   LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA| linc|3P|XLOC_067039|TCONS_00267116:3.53265|56AA|54AA|
A   LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|AB041803:0.181415|171AA|166AA| linc|3P|XLOC_067039|TCONS_00267119:0.429515|42AA|31AA|

对查询列表的其余部分做同样的事情,所有的都应该输出到同一个文件中。

这是我的代码(我不认为它在内存方面是最好的,但它有效):

library=pd.read_table("Library.txt")
mouse_lib=pd.Series(library['Mouse']).str.split("$|$")


dict1={}
human_lib=pd.Series(library['Human'].str.split("$|$"))
for index, value in human_lib.iteritems():
    k,v=index, human_lib[index]
    dict1[k]=v


out_match=open("Matching.xls", "w")

query=pd.read_table("Query.txt")
for i in range(0, len(query.index)):
    xloc=query.ix[i,"XLOC_ID"]
    for index, value in mouse_lib.iteritems():
        #print mouse_lib[index]
        if xloc in mouse_lib[index]:
            for value in dict1[index]:
                newline= query.ix[i,"GeneID-gtf"], xloc, str(value)
                out_match.write('\t'.join(newline)+'\n')

不幸的是,如果我使用“$|$”作为分隔符,代码将不起作用。如果我用任何其他字符串(例如 "ZZZYYY" 替换所有输入文件中的所有“$|$”,脚本就会工作。我不明白为什么会这样,我试图搜索“$|$”是否是预定义的 python 代码,但我没有找到任何类似的东西。此外,我不确定我上面的代码在内存和功率方面是否是最好的。如有任何建议,我们将不胜感激。

稍等……我们来看拆分命令:

mouse_lib=pd.Series(library['Mouse']).str.split("$|$")

您创建了一个 PANDAS 系列,然后将拆分应用于 系列 。拆分一个NDFrame是什么意思?

我认为您需要拆分输入并从中制作一个系列,不是吗?

您不能按 $|$ 拆分,因为它用作正则表达式 - 请参阅 str.split。您需要将其转义为 $\|$.

首先你可以read_csv.

那么你可以使用stack for creating one column for matching. Then concat Series mouse_lib and human_lib together and merging by merge. Last you can write out to_excel:

#if separator is not ',' use sep=";" for ';' or sep="\s+" for whitespace
library = pd.read_csv("Library.txt")
query = pd.read_csv("Query.txt")


mouse_lib = library['Mouse'].str.split(r"$\|$", expand=True).stack()
human_lib= library['Human'].str.split("$\|$", expand=True).stack()

df = pd.concat([human_lib, mouse_lib], axis=1, keys=['human','mouse']).reset_index(drop=True, level=1) 
print df
                                               human  \
0  LongAUGORFlinc|3P|XLOC_076196|TCONS_00295623:0...   
0  linc|3P|XLOC_037932|TCONS_00153577:0.957089|10...   
0  linc|3P|XLOC_048756|TCONS_00195334:1.35817|128...   
1  EnsASCoding|3P|XLOC_034831|TCONS_00142998:0.39...   
1  LongAUGORFlinc|3P|XLOC_033946|TCONS_00137705:0...   
1  EnsASCoding|3P|XLOC_000485|TCONS_00003136:0.41...   
1  EnsASCoding|3P|XLOC_034831|TCONS_00142998:0.39...   
2  linc|3P|XLOC_067039|TCONS_00267121:3.78124|173...   
2  linc|3P|XLOC_067039|TCONS_00267116:3.53265|56A...   
2  linc|3P|XLOC_067039|TCONS_00267119:0.429515|42...   
2  inc|3P|XLOC_067039|TCONS_00267121:3.78124|173A...   

                                               mouse  
0  linc|3P|XLOC_066319|TCONS_00127223:1.0925|85AA...  
0  LongAUGORFEnsASCoding|3P|XLOC_104581|TCONS_002...  
0  LongAUGORFEnsASCoding|3P|XLOC_113060|TCONS_002...  
1  linc|3P|XLOC_104529|TCONS_00206387:0.585795|11...  
1  EnsASCoding|3P|XLOC_082328|TCONS_00160013:0.60...  
1  LongAUGORFEnsASCoding|3P|XLOC_097111|TCONS_001...  
1                                                NaN  
2  LongAUGORFlinc|3P|XLOC_097853|TCONS_00194306|A...  
2  LongAUGORFlinc|3P|XLOC_097853|TCONS_00194302|A...  
2  LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|A...  
2                                                NaN 
out =  pd.merge(df, query , left_on=['mouse'], right_on=['XLOC_ID']) 
print out
                                               human  \
0  linc|3P|XLOC_067039|TCONS_00267119:0.429515|42...   

                                               mouse GeneID  \
0  LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|A...      A   

                                             XLOC_ID  
0  LongAUGORFlinc|3P|XLOC_097853|TCONS_00194307|A...  

out.to_xls("Matching.xls")