我有一个包含12列的表,希望根据第二列(sseqid
)选择第一列(qseqid
)中的项。这意味着第二列(sseqid
)在第11列和第12列中以不同的值重复,分别是evalue
和bitscore
。
我想得到的是最低的evalue
和最高的bitscore
(当evalue
相同时,其余的列可以忽略,数据在下面)。你知道吗
因此,我制作了一个简短的代码,它使用第二列作为字典的键。我可以从第二列中得到五个不同的项目,它们的列表是qseqid
+evalue
和qseqid
+bitscore
。你知道吗
代码如下:
#!usr/bin/python
filename = "data.txt"
readfile = open(filename,"r")
d = dict()
for i in readfile.readlines():
i = i.strip()
i = i.split("\t")
d.setdefault(i[1], []).append([i[0],i[10]])
d.setdefault(i[1], []).append([i[0],i[11]])
for x in d:
print(x,d[x])
readfile.close()
但是,我正在努力为每个sseqid获取具有最低evalue和最高bitscore的qseqid
。
有什么好的逻辑来解决这个问题吗?你知道吗
data.txt
文件(包括头行,»
表示制表符)
qseqid»sseqid»pident»length»mismatch»gapopen»qstart»qend»sstart»send»evalue»bitscore
ACLA_022040»TBB»32.71»431»258»8»39»468»24»423»2.00E-76»240
ACLA_024600»TBB»80»435»87»0»1»435»1»435»0»729
ACLA_031860»TBB»39.74»453»251»3»1»447»1»437»1.00E-121»357
ACLA_046030»TBB»75.81»434»105»0»1»434»1»434»0»704
ACLA_072490»TBB»41.7»446»245»3»4»447»3»435»2.00E-120»353
ACLA_010400»EF1A»27.31»249»127»8»69»286»9»234»3.00E-13»61.6
ACLA_015630»EF1A»22»491»255»17»186»602»3»439»8.00E-19»78.2
ACLA_016510»EF1A»26.23»122»61»4»21»127»9»116»2.00E-08»46.2
ACLA_023300»EF1A»29.31»447»249»12»48»437»3»439»2.00E-45»155
ACLA_028450»EF1A»85.55»443»63»1»1»443»1»442»0»801
ACLA_074730»CALM»23.13»147»101»4»6»143»2»145»7.00E-08»41.2
ACLA_096170»CALM»29.33»150»96»4»34»179»2»145»1.00E-13»55.1
ACLA_016630»CALM»23.9»159»106»5»58»216»4»147»5.00E-12»51.2
ACLA_031930»RPB2»36.87»1226»633»24»121»1237»26»1219»0»734
ACLA_065630»RPB2»65.79»1257»386»14»1»1252»4»1221»0»1691
ACLA_082370»RPB2»27.69»1228»667»37»31»1132»35»1167»7.00E-110»365
ACLA_061960»ACT»28.57»147»95»5»146»284»69»213»3.00E-12»57.4
ACLA_068200»ACT»28.73»463»231»13»16»471»4»374»1.00E-53»176
ACLA_069960»ACT»24.11»141»97»4»581»718»242»375»9.00E-09»46.2
ACLA_095800»ACT»91.73»375»31»0»1»375»1»375»0»732
下面是更具可读性的表格内容:
0 1 2 3 4 5 6 7 8 9 10 11
qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore
ACLA_022040 TBB 32.71 431 258 8 39 468 24 423 2.00E-76 240
ACLA_024600 TBB 80 435 87 0 1 435 1 435 0 729
ACLA_031860 TBB 39.74 453 251 3 1 447 1 437 1.00E-121 357
ACLA_046030 TBB 75.81 434 105 0 1 434 1 434 0 704
ACLA_072490 TBB 41.7 446 245 3 4 447 3 435 2.00E-120 353
ACLA_010400 EF1A 27.31 249 127 8 69 286 9 234 3.00E-13 61.6
ACLA_015630 EF1A 22 491 255 17 186 602 3 439 8.00E-19 78.2
ACLA_016510 EF1A 26.23 122 61 4 21 127 9 116 2.00E-08 46.2
ACLA_023300 EF1A 29.31 447 249 12 48 437 3 439 2.00E-45 155
ACLA_028450 EF1A 85.55 443 63 1 1 443 1 442 0 801
ACLA_074730 CALM 23.13 147 101 4 6 143 2 145 7.00E-08 41.2
ACLA_096170 CALM 29.33 150 96 4 34 179 2 145 1.00E-13 55.1
ACLA_016630 CALM 23.9 159 106 5 58 216 4 147 5.00E-12 51.2
ACLA_031930 RPB2 36.87 1226 633 24 121 1237 26 1219 0 734
ACLA_065630 RPB2 65.79 1257 386 14 1 1252 4 1221 0 1691
ACLA_082370 RPB2 27.69 1228 667 37 31 1132 35 1167 7.00E-110 365
ACLA_061960 ACT 28.57 147 95 5 146 284 69 213 3.00E-12 57.4
ACLA_068200 ACT 28.73 463 231 13 16 471 4 374 1.00E-53 176
ACLA_069960 ACT 24.11 141 97 4 581 718 242 375 9.00E-09 46.2
ACLA_095800 ACT 91.73 375 31 0 1 375 1 375 0 732
既然您是Python新手,我很高兴有几个例子说明如何手动执行此操作,但是为了进行比较,我将展示如何使用^{} 库来执行此操作,这使处理表格数据变得更加简单。你知道吗
因为您没有提供示例输出,所以我假设对于给定的
sseqid
,通过“每个sseqid具有最低的evalue和最高的bitscore”,您的意思是“最低evalues中的最高bitscore”;如果您希望这些分别,那也很简单。你知道吗产生
基本上,首先我们将数据文件读入一个名为
DataFrame
的对象,这有点像Excel工作表。然后我们按evalue
升序排序(这样低的evalue
优先),按bitscore
降序排序(这样高的bitscore
优先)。然后我们可以用groupby
来收集相等sseqid
的组中的数据,并在每个组中取第一个,由于排序的原因,这将是我们想要的。你知道吗虽然不像使用
pandas
库那样优雅和简洁,但是不借助第三方模块就可以做您想做的事情。下面使用collections.defaultdict
类来帮助创建具有可变长度记录列表的字典。使用AttrDict
类是可选的,但是它使得访问每个基于字典的记录的字段变得更容易,并且比通常的dict['fieldname']
语法看起来更简单。你知道吗输出(
»
表示制表符):结果是
相关问题 更多 >
编程相关推荐