查找模式是否匹配,然后从另一列输出拆分数据 - $|$ 分隔符失败
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")
作为较长代码的一部分,我在尝试执行以下操作时遇到了障碍: 我有一个包含 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")