快速过滤和计算数据行的方法

2024-09-24 02:27:49 发布

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

我有一张30万行的桌子。它包含了动物样本的基因数据。我有43k只动物,每只都有190-202个基因(它们可能不同,例如一只动物可能有AA1基因,第二只动物可能没有那个基因)。 示例数据框如下所示:

Gene_Name   AnimalNumber   Allele1   Allele2
AA1          0001            B          B
DSD          0001            A          B
KAD334       0001            A          B
EE2          0001            A          A
AA1          0002            A          A
DSD          0002            A          A
EE2          0002            A          B
COPA         0002            B          B

我需要做什么?你知道吗

  1. 需要计算表中出现了多少个基因。我只用df[Gene_name].value_counts()就可以了。你知道吗
  2. 需要计算有多少基因出现在特定的等位基因配置中。例如,配置只能是:AA、AB、BB。你知道吗

我认为这是我的弱点,因为我只是把所有SNP的名字都列出来,然后创建这样的循环:

  for i in range(len(genelist)):
    pick = len(df[df['Gene_Name']==genelist[i]].where(genotyp['Allele1'] == 'A' | genotyp['Allele2'] == A).dropna())
    listOfResults.append(pick)

我绕了三圈。一个用于AA,一个用于BB,一个用于AB。这是可行的,但需要几个小时:( 那么,如何做到这一点的熊猫没有obvius环?我是说更快。。。你知道吗

Expect result:
Gene_Name     all      AA      AB      BB
AA1           3330     2230   1000     0
DSD           1000     870    100      30
...
etc.

如我所说,我有“全部”一栏。如何加速第二、第三和第四阶段的数据收集。你知道吗

我没有发现对我的问题有任何帮助。你知道吗

我将非常感谢你的帮助。你知道吗


Tags: 数据namedflenab基因aa动物
2条回答

听起来像是交叉表

pd.crosstab(df['Gene_Name'], [df['Allele1'], df['Allele2']], margins=True)

使用groupby和apply:

df[(df['Allele1']=='A')|(df['Allele2']=='A')].groupby('Gene_Name').apply(len)

在您显示的数据帧上

Gene_Name
AA1       1
DSD       2
EE2       2
KAD334    1
dtype: int64

编辑: 上面的代码只是将所有具有“A”作为等位基因1或等位基因2的行分组,并统计出现的次数。所以呢

AA gets counted as A
AB gets counted as A
BB gets ignored

使用&而不是|会导致

AA getting counted
AB getting ignored
BB getting ignored

要获得所有不同组合的计数,您可以按基因等位基因分组:

df.groupby(by=['Gene_Name', 'Allele1', 'Allele2']).apply(len) 

我在10万个条目的合成数据集上进行了测试,大约需要一秒钟。你知道吗

或者,pd.crosstab,正如@Mark Wang所建议的,也是一个好主意

相关问题 更多 >