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

标签 python pandas numpy dataframe

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

相关文章:

python - 从一个 numpy 数组中删除另一个数组中元素的有效方法

python - 访问 Pandas DataFrame 元素中的列表

python - 获取 scipy.stats 分布的参数名称

python - 当存在 NaN 并且您想使用 groupby 时

python - 导入错误: cannot import name '_psutil_osx' from partially initialized module 'psutil

python - pandas 操作过程中的进度指示器

python - 如何根据 Pandas 数据框中的列值(int)合并行(带有字符串)?

python - Pandas 中每行的前 3 个值

python - 如何使用 numpy 为图像的所有相对白色部分创建蒙版?

python - sqlacodegen 不生成任何表