用不同的分组列快速过滤大Pandas数据帧?

2024-09-28 15:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想过滤一个巨大的python pandas数据帧。表中有四列。在

FLAT_DF.head() 
---

chr     loc     cell                    reads
1       6458    TCTTTCCTCACGGTTA        1
1       6459    TCTTTCCTCACGGTTA        1
1       6460    TCTTTCCTCACGGTTA        1
1       6461    TCTTTCCTCACGGTTA        3
1       6462    TCTTTCCTCACGGTTA        1
1       6463    TCTTTCCTCACGGTTA        1
1       6464    TCTTTCCTCACGGTTA        1
1       6465    TCTTTCCTCACGGTTA        1
1       6914    GGGCACTTCGGAAATA        1
1       6914    ACGATGTTCAGTTAGC        1
1       6914    CGACTTCGTTGTACAC        1
1       6914    AACTGGTCACGCTTTC        1
1       6914    TGTTCCGTCGTTTAGG        1
1       6914    GACTGCGGTGTTTGGT        2
1       6914    AGCTCCTTCCACGACG        1

我试图用一组复杂的规则过滤数据帧。在

^{pr2}$

上面的代码可以很好地处理示例数据,但是在过滤整个表时需要很长时间才能完成。 有更好的方法来实现它吗?我可以用np.where()代替吗?在


Tags: 数据pandasdfcellheadlocreadsflat
1条回答
网友
1楼 · 发布于 2024-09-28 15:32:44

我将使用^{}这样构造它

f, u = pd.factorize(df.cell.values)
g, t = pd.factorize(list(zip(df.chr.values.tolist(), df['loc'].values.tolist())))

r = df.reads.values

cond1 = (np.bincount(f, r) > 10000)[f]
cond2 = (np.bincount(f, r > 5) > 10)[f]
cond3 = (np.bincount(g, r > 1) > 10)[g]
cond4 = (np.bincount(f) > 1000)[f]

df[cond1 & cond2 & cond3 & cond4]

说明

  • pd.factorize返回散列事物数组的整数因式分解。在f, u的情况下,我们对'cell'列进行因子分解。其中u是唯一的单元格值(这里不需要)
  • np.bincount计算一个“bin”被引用的次数,并告诉我们如果我们刚刚传递了'cell'中每个唯一的细胞出现的次数。但是我们没有,我们还传递了r,这是weights参数。不是每次遇到来自f的“bin”时递增一个,而是增加r中相应的值。它充当groupbysum。通过随后用f对结果进行切片,我们有效地得到了groupbytransformsum。这比你刚才做的要快得多。在
  • 其他条件和因子分解也遵循同样的逻辑。在

相关问题 更多 >