Python Pandas:选择最大字符串长度

时间:2017-03-21 03:48:09

标签: python pandas

我有一张3人的桌子,以及他们的DNA序列。每个人的完整基因组由两个基因(字符串)组成:gene1和gene2(即full_genome = gene1+gene2),有时还有错误的重复条目。

该表目前的结构为:

row_num | name   | gene_name | dna_sequence
--------|--------|-----------|--------------
1       | sarah  | gene 1    | aaaaaaaaaa
2       | sarah  | gene 2    | gggggggggg
3       | charles| gene 1    | aaaattttt
4       | charles| gene 2    | ggggggtttt
5       | eric   | gene 1    | aaa
6       | eric   | gene 2    | cccccccccc
7       | eric   | gene 1    | aaaaa
8       | eric   | gene 2    | cccc
9       | eric   | gene 1    | a
10      | eric   | gene 2    | c

请注意第5行到第10行中Eric的重复条目。在所有这些中,我想只选择最长的总序列(即argmax(len(gene1)+len(gene2))),第5行和第6行。我还想转动该表最终以:

结束
name   | gene1      | gene2 
-------|------------|-----------
sarah  | aaaaaaaaaa | gggggggggg
charles| aaaattttt  | ggggggtttt
eric   | aaaaaaaaaa | cccccccccc

请注意,基因总是成对出现:每个数据源将其数据作为一个文件提交,表格是通过逐个文件读取形成的。因此,在Eric的案例中,总基因长度如下:

  • 第5行和第5行6:3 + 10 = 13
  • 第7行和第7行8:5 + 4 = 9
  • 第9行和第9行10:1 + 1 = 2

根据最长的总基因长度,我会保留第5行和第6行,并丢弃其余部分。

我已经尝试过pivot(),transpose()等等,但它更像是一个鸡与蛋的东西:由于重复的条目,我无法将表转换为所需的形式,但我可以' t测量总长度要么因为不容易分辨哪个重复条目来自哪里。

我目前正在尝试添加duplicate_index列,以便我可以区分重复项:

row_num | name   | gene_name | dna_sequence | dupe_index
--------|--------|-----------|--------------|------------
1       | sarah  | gene 1    | aaaaaaaaaa   | 0
2       | sarah  | gene 2    | gggggggggg   | 0
3       | charles| gene 1    | aaaattttt    | 0
4       | charles| gene 2    | ggggggtttt   | 0
5       | eric   | gene 1    | aaa          | 0
6       | eric   | gene 2    | cccccccccc   | 0
7       | eric   | gene 1    | aaaaa        | 1
8       | eric   | gene 2    | cccc         | 1
9       | eric   | gene 1    | a            | 2
10      | eric   | gene 2    | c            | 2

1 个答案:

答案 0 :(得分:1)

尝试1

df.loc[
    df.dna_sequence.str.len().groupby([df.name, df.gene_name]).idxmax()
].set_index(['name', 'gene_name']).dna_sequence.unstack()

gene_name      gene 1      gene 2
name                             
charles     aaaattttt  ggggggtttt
eric            aaaaa  cccccccccc
sarah      aaaaaaaaaa  gggggggggg