【问题标题】:Finding the count of letters in each column查找每列中的字母数
【发布时间】:2018-03-24 20:04:55
【问题描述】:

我需要按如下方式找到每列中的字母数:

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 行或第 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)

谁能帮我理解这个问题?

【问题讨论】:

    标签: python pandas bioinformatics biopython


    【解决方案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

    【讨论】:

    • 试过了,但所有值都为 0。
    • @Arpita,当您说“尝试过”时,您是否复制/粘贴代码完全如上?可能是您的数据不同,或者您没有正确应用上述代码。
    • 我没有复制粘贴。我根据代码中的变量使用它。
    • @AST,在这种情况下,除非您能够提供证明问题的数据,否则我无法帮助您。该代码确实适用于您在问题中提供的示例数据。
    【解决方案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)) ... 更快。

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 2013-04-24
      • 2018-03-07
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多