如何用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
相关产品推荐
相关产品推荐

