You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataFrame扩展:生成基因组坐标±250核苷酸的位置

高效扩展基因组坐标DataFrame的方案

针对你需要将基因组坐标区间扩展为每个位置的250bp侧翼区域的需求,这里提供两种高效实现方式,均避免Python层面的循环,适配30万行原始数据、百万级结果的场景:

方法一:基于Numpy向量化操作(推荐,性能最优)

利用Numpy的批量操作能力,直接生成所有需要的序列,避免逐行处理的开销:

import pandas as pd
import numpy as np

# 假设你的原始数据存储在df中
# df = pd.read_csv("your_data.csv")

# 计算每行需要生成的行数(区间内的碱基数量)
row_counts = df["end"] - df["start"] + 1

# 重复染色体列,对应扩展后的行数
expanded_chromosomes = np.repeat(df["chromosome"].values, row_counts)

# 生成所有中心碱基的位置:拼接每行的start到end的连续序列
all_centers = np.concatenate([np.arange(row_start, row_end + 1) for row_start, row_end in zip(df["start"], df["end"])])

# 计算侧翼区域的start和end
result_start = all_centers - 250
result_end = all_centers + 250

# 构建最终DataFrame
final_df = pd.DataFrame({
    "chromosome": expanded_chromosomes,
    "start": result_start,
    "end": result_end
}).reset_index(drop=True)

优势

  • 完全依赖Numpy的底层C实现,处理百万级数据时速度远快于Python循环或逐行apply
  • 内存使用更高效,避免中间过程生成大量临时Series

方法二:基于Pandas的explode方法(代码更简洁)

如果更看重代码可读性,可先为每行生成中心碱基序列,再通过explode扩展:

import pandas as pd
import numpy as np

# 为每行生成start到end的连续碱基位置序列
df["center_pos"] = df.apply(lambda row: np.arange(row["start"], row["end"] + 1), axis=1)

# 扩展序列为多行,并计算侧翼区域
final_df = (
    df.explode("center_pos", ignore_index=True)
    .assign(
        start=lambda x: x["center_pos"] - 250,
        end=lambda x: x["center_pos"] + 250
    )
    .drop(columns=["start", "end"], errors="ignore")  # 删除原始的start/end列
    .reset_index(drop=True)
)

注意

  • 此方法的apply是逐行处理,在30万行数据下,性能略逊于Numpy向量化方案,但仍远优于显式Python循环。

两种方法都能得到你需要的结果:将每行的chr1:11859-11879扩展为21行,每行对应一个中心碱基的±250bp区域。

内容的提问来源于stack exchange,提问作者youtube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:33:22