Сортировать конкретные значения из столбца в фрейме данных Panda - PullRequest
0 голосов
/ 30 июня 2018

у меня есть фрейм данных, например:

df =     ID  aa_len                                             aa_seq  \
0  001      45  [M, R, S, R, Y, P, L, L, R, G, E, A, V, A, V, ...   
1  002      45  [M, R, S, R, Y, P, L, L, R, G, E, A, V, A, V, ...   

   mut_position  
0              [-1]  
1  [5, 94, 95, 132]  

"Мут_позиция" может быть -1 или другим неотрицательным числом (2,3,4) или списком из нескольких чисел. например, это может быть -1, как в 001. список немногих, как в 002 или один номер - например, 4. мне нужно посчитать количество предметов, у которых нет -1.

Я пытался сделать так, чтобы, сравнивая с -1, собирал те, которые г разные, но это, похоже, не работает ...

def count_mutations(df, ref_aa_len):
nomis = -1
mutation = (df['mut_position']) != nomis 
print (mutation)

что я получу Правда для обоих (игнорируйте ref_aa_len, это должно произойти позже) -

0    True
1    True

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, что нужно list compehension с генератором и сумма логических True с:

df['non_negative'] = [sum(y != -1 for y in x) for x in df['mut_position']]
print (df)
       mut_position  non_negative
0              [-1]             0
1  [5, 94, 95, 132]             4

Если возможно, также скаляры:

print (df)
    mut_position
0           [-1]
1  [5,94,95,132]
2              6
3             -1

df['non_negative'] = [sum(y != -1 for y in x)  
                     if isinstance(x, list) 
                     else int(x != -1) for x in df['mut_position']]
print (df)
       mut_position  non_negative
0              [-1]             0
1  [5, 94, 95, 132]             4
2                 6             1
3                -1             0

При необходимости проверьте первые значения, если список для -1, и отфильтруйте по boolean indexing:

df = pd.DataFrame({'mut_position':[[-1], [5,94,95,132],[2,-1], [-1]]})

print (df)
       mut_position
0              [-1]
1  [5, 94, 95, 132]
2           [2, -1]
3              [-1]

df1 = df[df['mut_position'].str[0] != -1 ]
print (df1)
       mut_position
1  [5, 94, 95, 132]
2           [2, -1]

Деталь :

str[0] работает для выбора первого символа строки или первого значения итерируемого:

 print (df['mut_position'].str[0])
0   -1
1    5
2    2
3   -1
Name: mut_position, dtype: int64   

А для проверки -1 для любой позиции используйте all:

df1 = df[[all(y != -1 for y in x) for x in df['mut_position']]]
print (df1)
       mut_position
1  [5, 94, 95, 132]

Понимание списка возвращение списка булена:

print ([all(y != -1 for y in x) for x in df['mut_position']])
[False, True, False, False]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...