преобразование последовательности нуклеотида в двумерный массив целых чисел - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь преобразовать нуклеотид в целое число, используя следующее отображение:

A -> 0
C -> 1
G -> 2
T -> 3

Последовательность нуклеотида сохраняется в pandas фрейме данных и выглядит следующим образом:

           0
0   GGATAATA
1   CGATAACC

Я использовал метод df.apply () для выполнения задачи. Вот код:

import pandas as pd
a = ["GGATAATA","CGATAACC"]
d = dict(zip('A C G T'.split(), range(4)))
df = pd.DataFrame(a)
mapping = df[0].apply(lambda s: np.array([d[i] for i in s]))

Возвращает следующий массив numpy, который является одномерным:

print(mapping.values)
array([array([2, 2, 0, 3, 0, 0, 3, 0]), array([1, 2, 0, 3, 0, 0, 1, 1])],
      dtype=object)

Однако ожидаемый результат должен быть двумерным массивом:

[[2,2,0,3,0,0,3,0],
[1,2,0,3,0,0,1,1]]

Ответы [ 4 ]

1 голос
/ 27 марта 2020

IIU C

df['0'].apply(list).explode().replace(d).groupby(level=0).agg(list).to_list()
Out[579]: [[2, 2, 0, 3, 0, 0, 3, 0], [1, 2, 0, 3, 0, 0, 1, 1]]
1 голос
/ 27 марта 2020

Использование map:

list(map(lambda x: list(map(lambda c: d[c], list(x))), df[0]))

Вывод

[[2, 2, 0, 3, 0, 0, 3, 0], [1, 2, 0, 3, 0, 0, 1, 1]]

или

df[0].agg(list).explode().replace(d).groupby(level=0).agg(list).tolist()

Я думаю, что первое решение быстрее

%%timeit
list(map(lambda x: list(map(lambda c: d[c], list(x))), df[0]))
11.7 µs ± 392 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
df[0].agg(list).explode().replace(d).groupby(level=0).agg(list).tolist()
5.02 ms ± 697 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 27 марта 2020
import pandas as pd

a = ["GGATAATA","CGATAACC"]
d = dict(zip('A C G T'.split(), range(4)))
df = pd.DataFrame(a)

# implement mapping
mapping = str.maketrans('ACGT', '0123')
df[0] = df[0].map(lambda x: x.translate(mapping))

# expected output
output = df[0].map(lambda x: [int(x) for i in  list(x)]).tolist()
0 голосов
/ 27 марта 2020

с использованием .str.split() и stack с map

seq = {'A' : 0,
'C' : 1,
'G' : 2,
'T' : 3}

df[0].str.split('',expand=True).stack().map(seq).dropna().groupby(level=0).agg(list)

#out:

0    [2.0, 2.0, 0.0, 3.0, 0.0, 0.0, 3.0, 0.0]
1    [1.0, 2.0, 0.0, 3.0, 0.0, 0.0, 1.0, 1.0]
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...