我有一个包含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
我需要做什么?
df[Gene_name].value_counts()
就可以了。我认为这是我的弱点,因为我只列出了所有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.
我说了“所有”专栏。如何加快第二,第三和第四数据的收集。
我发现没有什么对我的问题有帮助。
感谢您的帮助。
答案 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
也是一个好主意