如何在pandas中为一行计算列表中元素的出现次数



我有一个df,看起来像这样。它是由生成的一组多索引df

grouped = df.groupby(['chromosome', 'start_pos', 'end_pos',
'observed']).agg(lambda x: x.tolist())
reference         zygosity    
chromosome  start_pos   end_pos observed                                            
chr1            69428   69428       G       [T, T]          [hom, hom]      
69511   69511       G       [A, A]          [hom, hom]      
762273  762273      A       [G, G, G]       [hom, het, hom] 
762589  762589      C       [G]             [hom]       
762592  762592      G       [C]             [het]       

对于每一行,我想计算zygosity中het和hom的数量。并创建一个名为"count_hom"one_answers"count_het"的新列

我试过使用for循环,它速度慢,而且在数据变化时不太可靠。有没有一种方法可以使用df.zygosity.len((.sum((这样的东西来实现这一点,但只适用于het或仅适用于hom

您可以通过在agg中包含一个计数为"0"的lambda来稍微调整groupby构造,而不是处理逐组结果;het";以及";hom";在构建grouped:时每个组的值

grouped = (df.groupby(['chromosome', 'start_pos', 'end_pos','observed'])
.agg(reference=('reference', list), 
zygosity=('zygosity', list), 
count_het=('zygosity', lambda x: x.eq('het').sum()),
count_hom=('zygosity', lambda x: x.eq('hom').sum())))

如果你想从所有列表中创建一个列表,你可以使用以下方法:

cols = ['chromosome', 'start_pos', 'end_pos','observed']
out = df.groupby(cols).agg(**{c: (c, list) for c in df.columns.drop('reference')}, 
count_het=('zygosity', lambda x: x.eq('het').sum()),
count_hom=('zygosity', lambda x: x.eq('hom').sum()))

Series.applyList count:一起使用

grouped['count_hom'] = grouped['zygosity'].apply(lambda x: x.count('hom'))
grouped['count_het'] = grouped['zygosity'].apply(lambda x: x.count('het'))

您可以使用explode+groupbyvalue_countsunstack:动态计数所有可能的值

new_df = pd.concat([df, df['zygosity'].explode().groupby(level=[0,1,2,3]).value_counts().unstack(level=4).fillna(0).add_prefix('count_').astype(int)], axis=1)

输出:

>>> new_df
reference         zygosity  count_het  count_hom
chromosome start_pos end_pos observed                                                  
chr1       69428     69428   G            [T, T]       [hom, hom]          0          2
69511     69511   G            [A, A]       [hom, hom]          0          2
762273    762273  A         [G, G, G]  [hom, het, hom]          1          2
762589    762589  C               [G]            [hom]          0          1
762592    762592  G               [C]            [het]          1          0

相关内容

  • 没有找到相关文章

最新更新