gpt4 book ai didi

python - 通过不同的分组列快速过滤 Pandas DataFrame 的方法?

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:19 26 4
gpt4 key购买 nike

我想过滤一个巨大的 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

我尝试通过一组复杂的规则来过滤数据框。

FILTERED_DF = FLAT_DF[
# filter cell with enough coverage
(FLAT_DF.groupby('cell').reads.transform(lambda x: x.sum()) > 10000) &
# filter cell has informative site
(FLAT_DF.groupby('cell').reads.transform(lambda x: (x > 5).sum()) > 10) &
# filter site has informative cell
(FLAT_DF.groupby(['chm', 'loc']).reads.transform(lambda x: (x > 1).sum()) > 10)
].reset_index()

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

最佳答案

我将使用 numpy.bincount 以这种方式构造它

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' 列中出现的次数 < strong>if 我们刚刚传递了 f 参数。但我们没有,我们还传递了 r,即 weights 参数。不是每次遇到来自 f 的“bin”时都递增 1,而是递增 r 中的相应值。这充当 groupbysum。通过随后使用 f 对该结果进行切片,我们有效地得到了一个 groupbytransformsum。这将比您正在执行的 transform 快得多。
  • 其他条件和因式分解也遵循相同的逻辑。

关于python - 通过不同的分组列快速过滤 Pandas DataFrame 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46108654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com