Заполнение dict списком в том же цикле - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь заполнить диктат по столбцам вхождения символов в Pandas Sereis. Sereis выглядит следующим образом:

>>> jkl
1     ATGC
2     GTCA    
3     CATG
Name: 0, dtype: object

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

{'A':[1,1,0,1],'C':[1,0,1,1],'G':[1,0,1,1],'T':[0,2,1,0]}

Я пробовал несколько кодов, и это один из них:

mylist = ['A', 'C', 'G','T']
dict = {key: None for key in mylist}
for i,(a,b) in enumerate(zip_longest(jkl[1],dict.keys())):
    t=str(list(jkl.str[i]))
    single_occurrences = Counter(t)    
    kl.append(single_occurrences.get(b))
    dict[b]=kl

Но этот дикт не содержит желаемого результата, есть ли решение?

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

Counter

from collections import Counter

pd.Series(Counter(
    (c, i) for i, C in enumerate(zip(*jkl)) for c in C)
).unstack(fill_value=0)

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

pd.Series(Counter(
    (c, i) for i, C in enumerate(zip(*jkl)) for c in C
)).unstack(fill_value=0).T.to_dict('l')

{'A': [1, 1, 0, 1], 'C': [1, 0, 1, 1], 'G': [1, 0, 1, 1], 'T': [0, 2, 1, 0]}


np.add.at

Совершенно другой курс

r, i = np.unique([*''.join(jkl)], return_inverse=True)
n, m = len(r), len(jkl)
j = np.tile(np.arange(n), m)
a = np.zeros((n, n), int)
np.add.at(a, (i, j), 1)

DataFrame

pd.DataFrame(a, r)

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

Dictionary

dict(zip(r, a.tolist()))

{'A': [1, 1, 0, 1], 'C': [1, 0, 1, 1], 'G': [1, 0, 1, 1], 'T': [0, 2, 1, 0]}
0 голосов
/ 09 ноября 2018

Вы можете сделать это так ( без использования панд ):

import pandas as pd

from itertools import chain
from collections import Counter

data = [[1, 'ATGC'],
        [2, 'GTCA'],
        [3, 'CATG']]

df = pd.DataFrame(data=data, columns=["row", "sequence"])
uniques = set(chain.from_iterable(df.sequence))
counts = list(map(Counter, zip(*df.sequence)))
result = {letter: [count.get(letter, 0) for count in counts] for letter in uniques}
print(result)

выход

{'G': [1, 0, 1, 1], 'A': [1, 1, 0, 1], 'T': [0, 2, 1, 0], 'C': [1, 0, 1, 1]}
0 голосов
/ 09 ноября 2018

Мы можем выполнить нарезку и подсчет в Пандах, а затем каждый раз составлять словарь с такими показателями, как:

max_len = jkl.str.len().max()
counts = [jkl.str[i].value_counts() for i in range(max_len)]
df = pd.DataFrame(counts, columns=['A', 'C', 'G', 'T'])

это дает нам фрейм данных:

>>> df
     A    C    G    T
0  1.0  1.0  1.0  NaN
1  1.0  NaN  NaN  2.0
2  NaN  1.0  1.0  1.0
3  1.0  1.0  1.0  NaN

затем мы можем заполнить NaN s нулями и преобразовать эти данные в int s:

>>> df.fillna(0).astype(int)
   A  C  G  T
0  1  1  1  0
1  1  0  0  2
2  0  1  1  1
3  1  1  1  0

наконец, мы можем преобразовать этот фрейм данных в словарь списков:

>>> df.fillna(0).astype(int).to_dict('list')
{'A': [1, 1, 0, 1], 'C': [1, 0, 1, 1], 'G': [1, 0, 1, 1], 'T': [0, 2, 1, 0]}
0 голосов
/ 09 ноября 2018

Использование crosstab после повторного создания вашего фрейма данных

S=pd.DataFrame(s.map(list).tolist()).melt()
pd.crosstab(S.value,S.variable)
Out[338]: 
variable  0  1  2  3
value               
A         1  1  0  1
C         1  0  1  1
G         1  0  1  1
T         0  2  1  0

после добавления to_dict

pd.crosstab(S.value,S.variable).T.to_dict('l')
Out[342]: {'A': [1, 1, 0, 1], 'C': [1, 0, 1, 1], 'G': [1, 0, 1, 1], 'T': [0, 2, 1, 0]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...