簡體   English   中英

如何計算 pandas 中連續列表中元素的出現次數

[英]How to count the occurances of elements in list in for a row in pandas

我有一個看起來像這樣的 df。 它是由 group-by 產生的多索引 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]       

對於每一行,我想計算合子中 het 和 hom 的數量。 並創建一個名為“count_hom”和“count_het”的新列

我試過使用 for 循環,它很慢,而且隨着數據的變化不太可靠。 有沒有辦法使用 df.zygosity.len().sum() 之類的方法來做到這一點,但僅適用於 het 或僅適用於 hom

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'))

您可以通過將 lambda 包含在agg中來稍微調整groupby的結構,而不是處理 groupby 結果,在您構建grouped時計算每個組的“het”和“hom”值:

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()))

您可以使用explode + groupby動態計算所有可能的值,然后是value_counts ,然后是unstack

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)

Output:

>>> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM