我有一张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行和第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
答案 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