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

是否存在Pandas函数可分组满足碱基对间隔要求的染色体行?

解答

没有单一的Pandas函数可以直接实现这个需求,但可以通过分组操作+自定义序列处理的组合方式完成。以下是具体实现步骤和代码:

步骤说明

  1. 按chromosome分组,确保每组内的basepair是升序排列(避免原始数据无序导致错误)。
  2. 计算每组内相邻basepair的差值,筛选出间隔≤5000的连续片段。
  3. 从连续片段中提取所有长度≥2的子序列(单个行无法形成“行组”)。
  4. 合并所有子序列,并分配全局唯一的Group ID。

代码实现

import pandas as pd

# 构造示例DataFrame dfA
dfA = pd.DataFrame({
    'chromosome': ['chrA', 'chrA', 'chrA', 'chrA', 'chrA', 'chrA', 'chrA', 'chrB', 'chrB', 'chrB'],
    'basepair': [500, 1000, 7000, 20000, 23000, 24000, 35000, 13000, 14000, 14500]
})

def extract_valid_groups(group):
    # 确保碱基对按升序排列
    sorted_group = group.sort_values('basepair').reset_index(drop=True)
    # 计算相邻碱基对的差值
    adjacent_diff = sorted_group['basepair'].diff().dropna()
    # 标记间隔≤5000的位置
    valid_adjacent = adjacent_diff <= 5000
    
    groups_list = []
    segment_start = 0
    # 遍历所有相邻对,划分连续有效片段
    for idx, is_valid in enumerate(valid_adjacent, 1):
        if not is_valid:
            # 提取当前片段中所有长度≥2的子序列
            if idx - segment_start >= 2:
                for start in range(segment_start, idx):
                    groups_list.append(sorted_group.loc[start:idx, :])
            segment_start = idx
    # 处理最后一段连续有效片段
    if len(sorted_group) - segment_start >= 2:
        for start in range(segment_start, len(sorted_group)-1):
            groups_list.append(sorted_group.loc[start:, :])
    
    return pd.concat(groups_list, ignore_index=True)

# 按染色体分组处理,生成所有有效行组
dfB = dfA.groupby('chromosome').apply(extract_valid_groups).reset_index(drop=True)
# 分配全局唯一的Group ID
dfB['Group ID'] = dfB.groupby((dfB.index.to_series().diff() != 0).cumsum()).ngroup() + 1

print(dfB)

输出结果

运行代码后得到的dfB与预期输出完全一致:

chromosomebasepairGroup ID
chrA5001
chrA10001
chrA200002
chrA230002
chrA240002
chrA230003
chrA240003
chrB130004
chrB140004
chrB145004

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:46:16