我有一个像小例子一样的大文本文件:
小例子:
chr1 10385347 10385379 11 chr1 10000000 11000000
chr1 10385348 10385379 40 chr1 10000000 11000000
chr1 10385348 10385379 40 chr1 10000000 11000000
chr1 10385348 10385379 381 chr1 10000000 11000000
chr1 10561009 10561040 12 chr1 10000000 11000000
chr1 10561009 10561040 24 chr1 10000000 11000000
chr1 10647768 10647799 68 chr1 10000000 11000000
chr1 10958095 10958126 17 chr1 10000000 11000000
chr1 11196862 11196893 39 chr1 11000000 12000000
chr1 11921548 11921579 56 chr1 11000000 12000000
chr1 13967589 13967620 111 chr1 13000000 14000000
chr1 15290638 15290669 11 chr1 15000000 16000000
chr1 15587268 15587299 32 chr1 15000000 16000000
chr1 15587268 15587299 13 chr1 15000000 16000000
我想计算第 6 列和第 7 列相同的行数。然后创建一个新文件,其中4 columns
包含“ column5
”、“ column6
”、“ column7
”、“ count
”。小示例的输出如下所示:
预期输出:
chr1 10000000 11000000 8
chr1 11000000 12000000 2
chr1 13000000 14000000 1
chr1 15000000 16000000 3
我正在尝试这样做python
并编写了以下代码:
file = open('infile.txt', 'rb')
line = []
for i in file:
line.append(i.split())
count = 0
new_list = []
for j in range(len(line)):
if line[j] == line[j-i]:
count+=1
new_list.append(count)
with open(outfile, "w") as f:
for item in new_list:
f.write("%s\n" % item)
但它不会返回我期望的输出。你知道怎么修吗?
您可能要考虑的一种方法是将文本文件作为 Pandas 数据框加载,然后使用库函数从那里开始工作。一个警告是,这种方法对于非常大的数据集会很慢。
您将需要按如下方式导入的 Pandas 和 Numpy 库
import numpy as np
import pandas as pd
接下来,您可以将数据作为数据框导入。
#Passing `names = ['column1','etc']` as an argument lets us define the headers to be used for each column
#As the name suggests, `delim_whitespace=True` makes whitespace the delimiter.
df = pd.read_csv('filename.txt',names=['column1','column2','column3','column4','column5','column6','column7'], delim_whitespace=True)
它生成以下数据帧:
column1 column2 column3 column4 column5 column6 column7
0 chr1 10385347 10385379 11 chr1 10000000 11000000
1 chr1 10385348 10385379 40 chr1 10000000 11000000
2 chr1 10385348 10385379 40 chr1 10000000 11000000
3 chr1 10385348 10385379 381 chr1 10000000 11000000
4 chr1 10561009 10561040 12 chr1 10000000 11000000
5 chr1 10561009 10561040 24 chr1 10000000 11000000
6 chr1 10647768 10647799 68 chr1 10000000 11000000
7 chr1 10958095 10958126 17 chr1 10000000 11000000
8 chr1 11196862 11196893 39 chr1 11000000 12000000
9 chr1 11921548 11921579 56 chr1 11000000 12000000
10 chr1 13967589 13967620 111 chr1 13000000 14000000
11 chr1 15290638 15290669 11 chr1 15000000 16000000
12 chr1 15587268 15587299 32 chr1 15000000 16000000
13 chr1 15587268 15587299 13 chr1 15000000 16000000
设置数据框后,我们现在可以使用 Pandas 函数来帮助操作数据框。
要创建一个新的数据框,其中我们有重复行 5,6 和 7 的计数,您可以使用以下内容(我假设您在第 5 行中有除 'chr1' 以外的其他值,所以也许我们想包括该行计算重复时?):
#groupby(['column5','column6','column7']) means that we're looking for duplicates across columns 5,6,7 and grouping them together
#.size() returns the number of duplicates aka the size of each group
#.reset_index().rename(columns={0:'count'}) is just giving the new column of duplicate numbers a header 'count'
dfnew = df.groupby(['column5','column6','column7']).size().reset_index().rename(columns={0:'count'})
这给了我dfnew:
column5 column6 column7 count
0 chr1 10000000 11000000 8
1 chr1 11000000 12000000 2
2 chr1 13000000 14000000 1
3 chr1 15000000 16000000 3
有了这个新的数据框,用数据生成一个文件就很简单了。
#The argument sep=' ' indicates that one space is used as a delimiter for the file
#The argument index=False omits the row indexes when writing to the file
df3.to_csv('newfile.txt',sep=' ',index=False)
最终文件是这样的:
column5 column6 column7 count
chr1 10000000 11000000 8
chr1 11000000 12000000 2
chr1 13000000 14000000 1
chr1 15000000 16000000 3
我希望这有帮助!
使用的参考资料:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句