Python 查找文本列表并在匹配字段处替换
好吧,我承认这个标题对我的问题来说是模糊的,我不能用一种更容易理解的方式来表达。我是编程新手,我的专业术语还在发展中 我有两个文件,文件Python 查找文本列表并在匹配字段处替换,python,unix,replace,Python,Unix,Replace,好吧,我承认这个标题对我的问题来说是模糊的,我不能用一种更容易理解的方式来表达。我是编程新手,我的专业术语还在发展中 我有两个文件,文件A看起来像: CHROM POS ID AGM12 AGM14 AGM15 AGM18 .. 1 14930 rs150145850 0/0 1/1 0/0 0/0 .. 1 14933 rs138566748 0/0 0/0 0/0 0/0 .. 1 63671 rs116440577 0/1 0/0 0/
A
看起来像:
CHROM POS ID AGM12 AGM14 AGM15 AGM18 ..
1 14930 rs150145850 0/0 1/1 0/0 0/0 ..
1 14933 rs138566748 0/0 0/0 0/0 0/0 ..
1 63671 rs116440577 0/1 0/0 0/0 0/0 ..
2 808922 rs6594027 0/0 0/0 0/0 0/1 ..
2 753474 rs2073814 1/0 0/0 0/1 0/0 ..
3 753405 rs61770173 0/0 1/1 0/0 1/0 ..
...
...
...
CHROM POS rsID Sample_ID
1 14930 rs150145850 AGM15
2 808922 rs6594027 AGM18
3 753405 rs61770173 AGM12
...
...
...
文件B
看起来像:
CHROM POS ID AGM12 AGM14 AGM15 AGM18 ..
1 14930 rs150145850 0/0 1/1 0/0 0/0 ..
1 14933 rs138566748 0/0 0/0 0/0 0/0 ..
1 63671 rs116440577 0/1 0/0 0/0 0/0 ..
2 808922 rs6594027 0/0 0/0 0/0 0/1 ..
2 753474 rs2073814 1/0 0/0 0/1 0/0 ..
3 753405 rs61770173 0/0 1/1 0/0 1/0 ..
...
...
...
CHROM POS rsID Sample_ID
1 14930 rs150145850 AGM15
2 808922 rs6594027 AGM18
3 753405 rs61770173 AGM12
...
...
...
我希望使用文件B
中的POS字段信息(第2列)将文件A
中相应的Sample\u ID
中的内容替换为NA
例如:输出应该如下所示
CHROM POS ID AGM12 AGM14 AGM15 AGM18
1 14930 rs150145850 0/0 1/1 NA 0/0
1 14933 rs138566748 0/0 0/0 0/0 0/0
1 63671 rs116440577 0/1 0/0 0/0 0/0
2 808922 rs6594027 0/0 0/0 0/0 NA
2 753474 rs2073814 1/0 0/0 0/1 0/0
3 753405 rs61770173 NA 1/1 0/0 1/0
如何在Python或Unix中实现这一点?试试这个
def method(file1, file2, fileout):
d1, d2, headers = {}
i = 1
with open(file1) as f1:
for line in f1:
vars = line.split('\t') #i am assuming tab seperated
d1[vars[1]] = [vars[0]] + vars[2:]
with open(file2) as f2:
for line in f2:
vars = line.split('\t')
d2[vars[1]] = vars[2]
for header in d1['POS']:
headers[header] = i
i+=1
with open(fileout, 'w') as fo:
fo.write("%s\tPOS\t%s\n" % (d1['POS'][0], "\t".join(d1['POS'][1:]))
del d1['POS']
for key, values in d1.items():
if key in d2:
d1[key][headers[d2[key]]] = "NA"
fo.write("%s\t%s\t%s\n" % (values[0], key, "\t".join(values[1:])))
试试这个
def method(file1, file2, fileout):
d1, d2, headers = {}
i = 1
with open(file1) as f1:
for line in f1:
vars = line.split('\t') #i am assuming tab seperated
d1[vars[1]] = [vars[0]] + vars[2:]
with open(file2) as f2:
for line in f2:
vars = line.split('\t')
d2[vars[1]] = vars[2]
for header in d1['POS']:
headers[header] = i
i+=1
with open(fileout, 'w') as fo:
fo.write("%s\tPOS\t%s\n" % (d1['POS'][0], "\t".join(d1['POS'][1:]))
del d1['POS']
for key, values in d1.items():
if key in d2:
d1[key][headers[d2[key]]] = "NA"
fo.write("%s\t%s\t%s\n" % (values[0], key, "\t".join(values[1:])))
如果您不介意安装一些软件包,您可以使用
pandas
:
A = pandas.DataFrame.from_csv("A.txt", sep="\t", index_col=(0,1))
B = pandas.DataFrame.from_csv("B.txt", sep="\t", index_col=(0,1))
A.join(B) # the resulting dataset
当然,您必须选择熊猫才能完成此操作。如果您不介意安装一些软件包,您可以使用熊猫来完成此操作:
A = pandas.DataFrame.from_csv("A.txt", sep="\t", index_col=(0,1))
B = pandas.DataFrame.from_csv("B.txt", sep="\t", index_col=(0,1))
A.join(B) # the resulting dataset
当然,要做到这一点,您必须选择
pandas
。这里有一个使用模块的版本(我假设您的列是以制表符分隔的)
下面是一个使用模块的版本(我假设您的列是以制表符分隔的)
我想说清楚,你有两个文件。这些文件是数据行。两个文件中的数据通过“POS”键匹配。您想将file1中file2中列出的colm的内容替换为NA?-此外,file2中是否存在相同键的重复项?很难说列是如何分隔的,我想说是tab分隔的,但对于file
A
的第一个数据行,列似乎是以tab分隔的?这样做是为了把标签变成空格吗?真的,我的问题是,如何定义输出对齐方式?@InbarRose因为你提到了重复项,我忘了提到文件A也可以同时包含重复项“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/01/10/0/0。。114933 rs138566748 0/0 0/0 0/0。。163671 rs116440577 0/10/0/0/0。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。2753474 rs2073814 1/0 0/0/1 0/0。。3 753405 rs61770173 0/0 1/1 0/0 1/0..需要澄清的是,您有两个文件。这些文件是数据行。两个文件中的数据通过“POS”键匹配。您想将file1中file2中列出的colm的内容替换为NA?-此外,file2中是否存在相同键的重复项?很难说列是如何分隔的,我想说是tab分隔的,但对于fileA
的第一个数据行,列似乎是以tab分隔的?这样做是为了把标签变成空格吗?真的,我的问题是,如何定义输出对齐方式?@InbarRose因为你提到了重复项,我忘了提到文件A也可以同时包含重复项“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/01/10/0/0。。114933 rs138566748 0/0 0/0 0/0。。163671 rs116440577 0/10/0/0/0。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。2753474 rs2073814 1/0 0/0/1 0/0。。3 753405 rs61770173 0/0 1/1 0/0 1/0..使用此模块可能是有意义的。是的,但我喜欢写尽可能少使用导入的答案,特别是当涉及初学者时。足够公平。我想知道有一个(包括电池)模块来完成大部分烦人的工作是很有用的。在处理csv文件(空白、引用值等)时有很多陷阱@InbarRose-1不,不够“公平”--应该教导初学者始终使用“自带电池”库@既然你提到了副本,我忘了提到文件A也可以有副本“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/0 1/1 0/0 0/0。。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。我想用文件1中的示例ID替换匹配的POS/和CHROM键交叉处的数据点使用该模块可能有意义。是的,但我喜欢写尽可能少导入的答案,特别是当涉及初学者时。这很公平。我想知道有一个(包括电池)模块来完成大部分烦人的工作是很有用的。在处理csv文件(空白、引用值等)时有很多陷阱@InbarRose-1不,不够“公平”--应该教导初学者始终使用“自带电池”库@既然你提到了副本,我忘了提到文件A也可以有副本“POs”键,但色度中的相应变量可能不同。例如:CHROM POS ID AGM12 AGM14 AGM15 AGM18。。114930 rs150145850 0/0 1/1 0/0 0/0。。。214930 rs1578634 0/0 1/1 0/0 0。。2 808922 rs6594027 0/0 0/0 0/0 0/1。。我想用文件1中的样本ID替换匹配的POS/和CHROM键交叉处的数据点。这并不能解决他的问题,他不是在合并数据,而是用NA替换列中的数据,其中数据键的列位于第二个文件中。@InbarRose good point--A.join(B,how=“outer”)
可以这样做。这并不能解决他的问题,他不是在合并数据,而是用NA替换列中的数据,其中数据键的列位于第二个文件中。@in