更快地过滤和计算熊猫行的方法

时间:2019-11-24 22:25:45

标签: python pandas dataframe

我有一个包含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循环:

  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。可以,但是要花几个小时:( 那么,如何在没有ob回循环的情况下用熊猫做到这一点呢?我的意思是更快...

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

我说了“所有”专栏。如何加快第二,第三和第四数据的收集。

我发现没有什么对我的问题有帮助。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

类似交叉表的声音

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

答案 1 :(得分:1)

使用groupby并应用:

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'的行分组为Allele1或Allele2,并对出现的次数进行计数。所以

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) 

我在100k条目的综合数据集上对此进行了测试,大约需要一秒钟。

或者,@ Mark Wang推荐的pd.crosstab也是一个好主意