【问题标题】:How to count elements with a condition in csv file using python如何使用python计算csv文件中具有条件的元素
【发布时间】:2021-04-26 21:21:54
【问题描述】:

我是 python 语言的新手。我有一个 csv 格式的表格,其中有 n 列,其中标题是 Tax_id,每列都包含这样的物种名称

9606                  9606.1               508771  
0                root                root                  root    
1  cellular organisms  cellular organisms    cellular organisms
2           Eukaryota           Eukaryota             Eukaryota
3        Opisthokonta        Opisthokonta                   Sar
4             Metazoa             Metazoa             Alveolata
5           Eumetazoa           Eumetazoa           Apicomplexa
6           Bilateria           Bilateria           Conoidasida
7       Deuterostomia       Deuterostomia              Coccidia
8            Chordata            Chordata        Eucoccidiorida
9            Craniata            Craniata           Eimeriorina

我想要做的是能够编写一个 python 代码,仅对包含名为“Metazoa”的物种的列来计算每个物种的出现次数。

#to return something like

    Eumetazoa 2
    Bilateria 2
    Craniata  2

【问题讨论】:

  • 欢迎来到 StackOverflow!您需要更具体地说明您正在寻找什么样的输出。只是随机计数匹配列中出现的所有字符串?另外,每一列代表一个物种的分类等级,对吧?
  • 感谢您的回复,是的,每一列都有分类等级。因此,我正在寻找的输出是包含“Metazoa”的每一列中所有组的计数,因为我的表有超过 3000 列,我只想要只包含“Metazoa”的列中所有组的计数

标签: python csv bioinformatics


【解决方案1】:

我仍然不完全确定您想要什么。这样的事情有用吗?请注意,您需要为此安装包 pandas (How to install pandas)。

我假设您的 CSV 文件如下所示:

s = '''9606,9606.1,508771
0,root,root,root
1,cellular organisms,cellular organisms,cellular organisms
2,Eukaryota,Eukaryota,Eukaryota
3,Opisthokonta,Opisthokonta,Sar
4,Metazoa,Metazoa,Alveolata
5,Eumetazoa,Eumetazoa,Apicomplexa
6,Bilateria,Bilateria,Conoidasida
7,Deuterostomia,Deuterostomia,Coccidia
8,Chordata,Chordata,Eucoccidiorida
9,Craniata,Craniata,Eimeriorina'''

算法:

import pandas as pd
from io import StringIO

def filter_and_count(df, search_string):
    df_filtered = df.loc[:, (df == search_string).any(axis=0)]
    return pd.melt(df_filtered)['value'].value_counts()

df = pd.read_csv(StringIO(s))  # replace this with read_csv("filename")
print(filter_and_count(df, 'Metazoa'))

输出:

root                  2
Metazoa               2
Deuterostomia         2
Craniata              2
cellular organisms    2
Chordata              2
Eumetazoa             2
Opisthokonta          2
Eukaryota             2
Bilateria             2
Name: value, dtype: int64

【讨论】:

  • 如果我想从每列的第 5 个元素开始计算门呢?怎么调整?
  • filter_and_count(df[4:], 'Metazoa') 应该可以工作
  • 感谢您的快速回答,我的意思是从每列中的第 5 个元素开始计算门,无论是否存在“后生动物”。换句话说,对于不包含“Metazoa”的列,也从第 5 个元素开始计数
  • pd.melt(df[4:])['value'].value_counts() 然后
  • 所以你的输入不一样?您可以在函数调用之前尝试转置它:filter_and_count(df.transpose(), search_string)
猜你喜欢
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多