преобразование последовательности нуклеотида в двумерный массив целых чисел

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

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

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

           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]))

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

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 ответа


IIUC

df[Ɔ'].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]]

Используйте 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)

использование .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

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', 񟏫')
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()

Есть идеи?

10000