我有一個看起來像這樣的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
uj5u.com熱心網友回復:
除了處理 groupby 結果,您可以groupby通過包含一個 lambda 來稍微調整您的構造,agg以便在您構建時計算每個組的“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())))
uj5u.com熱心網友回復:
Series.apply與 一起使用List count:
grouped['count_hom'] = grouped['zygosity'].apply(lambda x: x.count('hom'))
grouped['count_het'] = grouped['zygosity'].apply(lambda x: x.count('het'))
uj5u.com熱心網友回復:
explode您可以使用 groupby、 then value_counts、 then動態計算所有可能的值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)
輸出:
>>> 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446248.html
