Используйте уникальные значения для столбца в пандах - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть датафрейм в пандах, который имеет пять столбцов: contig, длина, идентичность, процент и попадание.Эти данные анализируются из выходных данных BLAST и сортируются по длине и процентному соответствию.Моя цель состоит в том, чтобы вывод выводил только строку для каждого уникального контига.Пример вывода:

   contig        length  identity     percent  hit                                                                             
   contig-100_0  5485    [1341/1341]  [100.%]  ['hit1']
   contig-100_0  5485    [5445/5445]  [100.%]  ['hit2']
   contig-100_0  5485        [59/59]  [100.%]  ['hit3']
   contig-100_1  2865    [2865/2865]  [100.%]  ['hit1']
   contig-100_2  2800    [2472/2746]  [90.0%]  ['hit1']
   contig-100_3  2417    [2332/2342]  [99.5%]  ['hit1']
   contig-100_4  2204    [2107/2107]  [100.%]  ['hit1']
   contig-100_4  2000    [1935/1959]  [98.7%]  ['hit2']

Я бы хотел, чтобы вышеприведенное выглядело так:

   contig        length  identity     percent  hit                                                                             
   contig-100_0  5485    [1341/1341]  [100.%]  ['hit1']
   contig-100_1  2865    [2865/2865]  [100.%]  ['hit1']
   contig-100_2  2800    [2472/2746]  [90.0%]  ['hit1']
   contig-100_3  2417    [2332/2342]  [99.5%]  ['hit1']
   contig-100_4  2204    [2107/2107]  [100.%]  ['hit1']

Вот код, который я использую для вывода выше:

df = pd.read_csv(path+i,sep='\t', header=None, engine='python', \ 
     names=['contig','length','identity','percent','hit'])
df = df.sort_values(['length', 'percent'], ascending=[False, False])
top_hits = df.to_string(justify='left',index=False)
with open ('sorted_contigs', 'a') as sortedfile:
    sortedfile.write(top_hits+"\n")

Я знаю о методе unique () в pandas и думаю, что мне нужно использовать синтаксис df.contig.unique(), но я не уверен, где в коде я бы его разместил.Я все еще учу панд, поэтому любая помощь приветствуется!Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете сделать это с DataFrame.groupby(<colname>).head(<num_of_rows>):

df.groupby('contig').head(1)

И выводом:

          contig    length  identity    percent hit
0   contig-100_0    5485    [1341/1341] [100.%] ['hit1']
3   contig-100_1    2865    [2865/2865] [100.%] ['hit1']
4   contig-100_2    2800    [2472/2746] [90.0%] ['hit1']
5   contig-100_3    2417    [2332/2342] [99.5%] ['hit1']
6   contig-100_4    2204    [2107/2107] [100.%] ['hit1']
...