簡體   English   中英

查找每一列中的字母數

[英]Finding the count of letters in each column

我需要找到每一列中的字母數,如下所示:

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索引中的一行,最后是nan值(列索引450,實際列號451)。 我不應該獲得行或列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)

誰能幫我理解這個問題?

這是實現邏輯的一種方法。 如果需要,您可以通過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)) ...更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM