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()
预期输出为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()