Python 我可以使用pandas agg不迭代地执行此操作吗?

Python 我可以使用pandas agg不迭代地执行此操作吗?,python,python-3.x,pandas,dataframe,aggregate,Python,Python 3.x,Pandas,Dataframe,Aggregate,有人能帮我改进这个代码吗 import pandas as pd df = pd.DataFrame( [ [ 'chr1', 222 ], [ 'chr1', 233 ], [ 'chr1', 2123 ], [ 'chr2', 244 ] ], colu

有人能帮我改进这个代码吗

import pandas as pd

df = pd.DataFrame(
    [
        [
            'chr1', 222
        ],
        [
            'chr1', 233
        ],
        [
            'chr1', 2123
        ],
        [
            'chr2', 244
        ]
    ], columns = ['chrom', 'pos']
)

df2 = pd.DataFrame(
    [
        [
            'chr1', 221, 223
        ],
        [
            'chr1', 230, 240
        ],
    ], columns = ['chrom', 'start', 'end']
)
给我2个带有基因组坐标的dfs。第一个是准确的位置:

    chrom   pos
0   chr1    222
1   chr1    233
2   chr1    2123
3   chr2    244
第二个是范围:

    chrom   start   end
0   chr1    221 223
1   chr1    230 240
我需要找到一个范围内(同一色度)的精确坐标数

这可以工作,但速度很慢:

c=0
for chrom, data in df.groupby('chrom'):
    tmp = df2.query(f'chrom == "{chrom}"')
    for p in data.pos:
        for s, e in zip(tmp.start, tmp.end):
            if s < p < e:
                c+=1
c=0
对于色度,df.groupby(“色度”)中的数据:
tmp=df2.query(f'chrom==“{chrom}”)
对于data.pos中的p:
对于zip中的s、e(tmp.start、tmp.end):
如果s
那么c=2

我想我可以使用agg来完成这项工作,而无需迭代(希望更快),但我无法让它工作。有人能告诉我怎么做吗


PS在生物信息学测试版堆栈上也会询问此问题。

未提供预期输出。这将计算色度在某一范围内的次数

  • 使用
    RangeIndex()
    explode()
  • merge()
  • groupby()
    count()
色度 销售时点情报系统 rng 0 chr1 222 1. 1. chr1 233 1. 2. chr1 2123 0 3. chr2 244 0
预期输出为C=2。也许我应该把它放在代码部分,对不起。不过,我可以从你的代码中看到如何到达那里,谢谢!所以它是rng列的和?基于这个小的输出,是的。它只是所有实例的总和,一个pos(基因组位置)在同一条染色体上的一个给定的开始和结束之间。我认为这实际上比较慢。它非常需要内存,我在一个实际的数据集上试用了它,然后把我的笔记本电脑换成了内存。我得在服务器上试试。实际上是你们问的同一个问题,在哪里调整解决方案
dfc = df.merge(df2.assign(rng=df2.apply(lambda r: pd.RangeIndex(r["start"], r["end"]+1), axis=1)).explode("rng"),
         left_on=["chrom","pos"], right_on=["chrom","rng"],
         how="left"
        ).groupby(["chrom","pos"], as_index=False)["rng"].count()