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

如何用Pandas/groupby为跨组重复的cytoband添加区分后缀?

为重复cytoband添加区分后缀的Pandas解决方案

原始数据

原始DataFrame如下:

peakID cytoband      start        end    length  10.388_116  10.193_156  10.401_184  10.214_385
0  Amp_2q37.3_chr2:237990001-242193529   2q37.3  237990001  242193529   4203528           1           0           0           0
1  Del_2q37.3_chr2:226990001-242193529   2q37.3  226990001  242193529  15203528          -1           0           0           0

其中peakID唯一但cytoband重复,现有处理流程丢弃peakID后,无法区分不同来源的state记录。

现有处理代码及问题

原处理代码:

import pandas as pd
import pyjanitor
from natsort import natsort_keygen

table = (
        table
        .drop(columns="peakID")
       .pivot_longer(index=["cytoband", "start", "end", "length"],
                     names_to="sample", values_to="state")
            .sort_values(["cytoband", "sample"], key=natsort_keygen())
            .remove_columns(["length", "start", "end"])
            .set_index("cytoband")
        )

处理后同一sample对应两条state记录,无法区分来源:

table.loc["2q37.3", :]
Out[36]: 
              sample  state
cytoband                   
2q37.3    10.193_156      0
2q37.3    10.193_156      0
2q37.3    10.214_385      0
2q37.3    10.214_385      0
2q37.3    10.388_116      1
2q37.3    10.388_116     -1
2q37.3    10.401_184      0
2q37.3    10.401_184      0

解决方案

通过groupby为重复的cytoband生成唯一后缀,修改后的完整代码如下:

import pandas as pd
import pyjanitor
from natsort import natsort_keygen

# 为重复cytoband添加A/B类区分后缀
table['cytoband'] = (
    table['cytoband'] + '_' 
    + table.groupby('cytoband').cumcount().apply(lambda x: chr(ord('A') + x))
)

# 执行后续数据处理流程
table = (
    table
    .drop(columns="peakID")
    .pivot_longer(index=["cytoband", "start", "end", "length"],
                  names_to="sample", values_to="state")
    .sort_values(["cytoband", "sample"], key=natsort_keygen())
    .remove_columns(["length", "start", "end"])
    .set_index("cytoband")
)

处理结果

修改后cytoband变为唯一标识,可清晰区分不同来源的state记录:

table.loc[['2q37.3_A', '2q37.3_B'], :]
Out:
              sample  state
cytoband                   
2q37.3_A  10.193_156      0
2q37.3_A  10.214_385      0
2q37.3_A  10.388_116      1
2q37.3_A  10.401_184      0
2q37.3_B  10.193_156      0
2q37.3_B  10.214_385      0
2q37.3_B  10.388_116     -1
2q37.3_B  10.401_184      0

原理说明

  • table.groupby('cytoband').cumcount():按cytoband分组后,为每组内的行生成从0开始的连续序号
  • chr(ord('A') + x):将序号0、1...转换为A、B...的后缀,与原cytoband拼接后生成唯一标识

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:33:09