Python 基于列删除连续的重复行
我正在努力解决一个问题,下面将对此进行解释。我也分享了不完整的python脚本,它不能解决这个问题。如果我的剧本能得到支持或指导,我将不胜感激 我的制表符分隔文件如下所示:Python 基于列删除连续的重复行,python,Python,我正在努力解决一个问题,下面将对此进行解释。我也分享了不完整的python脚本,它不能解决这个问题。如果我的剧本能得到支持或指导,我将不胜感激 我的制表符分隔文件如下所示: + 5 1364182 TTGC - 5 1364204 GATG + 1 9372980 TTCA - 1 9373028 GGAA + 2 14029383 ACCA - 2 14029437 ACCA - 1
+ 5 1364182 TTGC
- 5 1364204 GATG
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029437 ACCA
- 1 19815169 AGTT
- 1 19815254 CCGT
+ 4 13475195 AGCA
- 4 13475251 TCTC
- 5 64182 TTGC
- 5 64204 GATG
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029586 ACCT
我试图在第一列(即+和-)的基础上删除除第一个匹配之外的所有行。输出应该如下所示:
+ 5 1364182 TTGC
- 5 1364204 GATG
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029437 ACCA
+ 4 13475195 AGCA
- 4 13475251 TCTC
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029586 ACCT
脚本:
#!/usr/bin/python
gff = raw_input("Enter the gff file: ")
gff_file = open(gff, "r")
f1 = open("f1", "w")
for line in gff_file:
line = line.rstrip()
line = line.split("\t")
x = line[0]
for line1 in gff_file:
line1 = line1.rstrip()
line1 = line1.split("\t")
y = next(line1[0])
if x != y:
f1.write(x + line1[0]+"\n")
我无法将第一列条目与连续的同一列条目进行比较。
文件非常大,因此一行程序无法工作。如果这不是编程练习,您只想清理数据,请切换到
awk
。它甚至不是一个班轮
$ awk 'p!=$1{p=$1; print}' file
+ 5 1364182 TTGC
- 5 1364204 GATG
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029437 ACCA
+ 4 13475195 AGCA
- 4 13475251 TCTC
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
如果这不是编程练习,而您只想清理数据,请切换到
awk
。它甚至不是一个班轮
$ awk 'p!=$1{p=$1; print}' file
+ 5 1364182 TTGC
- 5 1364204 GATG
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
- 2 14029437 ACCA
+ 4 13475195 AGCA
- 4 13475251 TCTC
+ 1 9372980 TTCA
- 1 9373028 GGAA
+ 2 14029383 ACCA
如果我理解正确的话,您基本上是按照第一个符号(
+
或-
)的集群进行分组,并且您只希望保留第一个符号。这是一个很好的用例:
groupby
接受一个iterable(这里是中的输入文件fp_)和一个键函数,我将其传递为lambda x:x.split(“\t”)[0]
,意思是“取行,按制表符拆分,并给我第一个元素”
它产生一对包含一个键(这里是+
或-
)和一个遍历组中所有元素的迭代器——在本例中,是以相同符号开头的连续行组。我们用next(group)
选择第一个并写出它 如果我理解正确,您基本上是按照第一个符号的集群进行分组(+
或-
),您只想保留第一个符号。这是一个很好的用例:
groupby
接受一个iterable(这里是
中的输入文件fp_)和一个键函数,我将其传递为lambda x:x.split(“\t”)[0]
,意思是“取行,按制表符拆分,并给我第一个元素”
它产生一对包含一个键(这里是+
或-
)和一个遍历组中所有元素的迭代器——在本例中,是以相同符号开头的连续行组。我们用next(group)
选择第一个并写出它 这应该可以做到:
consec_lines = False
x = None
for line in gff_file:
line = line.rstrip()
line = line.split("\t")
if line[0] == x:
consec_lines = True
continue
x = line[0]
consec_lines = False
for i in line+"\n":
f1.write(i)
这应该可以做到:
consec_lines = False
x = None
for line in gff_file:
line = line.rstrip()
line = line.split("\t")
if line[0] == x:
consec_lines = True
continue
x = line[0]
consec_lines = False
for i in line+"\n":
f1.write(i)
你能详细说明一下吗!你的例子不容易理解!你想用y=next(第1[0]行]
实现什么?你为什么要删除-1 19815169 AGTT
?实际上他正在删除-1 19815169 AGTT
和-1 19815254 CCGT
@Dataman我已经编辑了这个例子,请看一看,你能详细说明一下吗!你的例子不容易理解!你想用y=next(第1[0]行]
实现什么?你为什么要删除-1 19815169 AGTT
?实际上他正在删除-1 19815169 AGTT
和-1 19815254 CCGT
@Dataman我已经编辑了示例,请看一看