Нахождение количества букв в каждом столбце

Мне нужно найти количество букв в каждом столбце следующим образом:

String: ATCG
        TGCA
        AAGC
        GCAT

Строка - это серия.

Мне нужно написать программу, чтобы получить следующее:

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

Я написал следующий код, но получаю строку с индексом 0 и столбцом в конце (индекс столбца 450, фактический столбец № 451) со значениями nan. Я не должен получать ни строку, ни столбец 451. Мне нужно иметь только 450 столбцов.

f = zip(*string)
counts = [{letter: column.count(letter) for letter in column} for column in 
f]
counts=pd.DataFrame(counts).transpose()
print(counts)
counts = counts.drop(counts.columns[[450]], axis =1)

Может кто-нибудь, пожалуйста, помогите мне понять проблему?

2 ответа

Вот один из способов реализации вашей логики. При необходимости вы можете превратить свою серию в список с помощью lst = s.tolist(),

lst = ['ATCG', 'TGCA', 'AAGC', 'GCAT']

arr = [[i.count(x) for i in zip(*lst)] for x in ('ATCG')]

res = pd.DataFrame(arr, index=list('ATCG'))

Результат

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

объяснение

  • В понимании списка сначала разберитесь со столбцами, последовательно итерируя первый, второй, третий и четвертый элементы каждой строки.
  • Работайте со вторыми строками, последовательно просматривая ATCG.
  • Это создает список списков, которые могут быть переданы непосредственно в pd.DataFrame,

С Series.value_counts():

>>> s = pd.Series(['ATCG', 'TGCA', 'AAGC', 'GCAT'])

>>> s.str.join('|').str.split('|', expand=True)\
...     .apply(lambda row: row.value_counts(), axis=0)\
...     .fillna(0.)\
...     .astype(int)
   0  1  2  3
A  2  1  1  1
C  0  1  2  1
G  1  1  1  1
T  1  1  0  1

Я не уверен, насколько логично вы хотите заказать индекс, но вы могли бы позвонить .reindex() или же .sort_index() на этот результат.

Первая строка, s.str.join('|').str.split('|', expand=True) получает "расширенную" версию

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

который должен быть быстрее, чем звонить pd.Series(list(x)) ... на каждом ряду.

Другие вопросы по тегам