查找每列中的字母数

2024-09-26 22:50:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要找出每列中的字母数,如下所示:

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)

有人能帮我理解这个问题吗?你知道吗


Tags: 字符串代码in程序forstring字母column
2条回答

使用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)) ...更快。你知道吗

这里有一种方法可以实现你的逻辑。如果需要,可以通过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。你知道吗

相关问题 更多 >

    热门问题