Python Pandas:如何拆分并展开DataFrame的多元素INFO列?
问题描述
现有如下结构的Pandas DataFrame:
CHR START END INFO 2547 X 153595089 153595228 FLNA_NM_001110556.2_ex05,FLNA_NM_001456.4_ex05 2548 X 153595754 153595922 FLNA_NM_001110556.2_ex04,FLNA_NM_001456.4_ex04 2549 X 153595998 153596116 FLNA_NM_001110556.2_ex03,FLNA_NM_001456.4_ex03 2550 X 153596199 153596468 FLNA_NM_001110556.2_ex02,FLNA_NM_001456.4_ex02 2551 X 153599230 153599623 FLNA_NM_001110556.2_ex01,FLNA_NM_001456.4_ex01
对应的字典形式为:
{'CHR': ['X', 'X', 'X', 'X', 'X'], 'START': [153595089, 153595754, 153595998, 153596199, 153599230], 'END': [153595228, 153595922, 153596116, 153596468, 153599623], 'INFO': ['FLNA_NM_001110556.2_ex05,FLNA_NM_001456.4_ex05', 'FLNA_NM_001110556.2_ex04,FLNA_NM_001456.4_ex04', 'FLNA_NM_001110556.2_ex03,FLNA_NM_001456.4_ex03', 'FLNA_NM_001110556.2_ex02,FLNA_NM_001456.4_ex02', 'FLNA_NM_001110556.2_ex01,FLNA_NM_001456.4_ex01']}
需求:将INFO列的每个单元格内容按逗号拆分为列表后展开,使每个元素单独占一行,其余列内容保持对应(INFO列每个单元格可能含1个或2个元素)。
尝试的代码:
WRGL4_hg19.assign(tmp=WRGL4_hg19["INFO"].str.split()).explode("INFO").reset_index(drop=True)
未得到预期结果:输出中INFO列仍为原始多元素值,新增的tmp列仅含单个元素。预期输出示例:
CHR START END INFO 0 X 153595089 153595228 FLNA_NM_001110556.2_ex05 0 X 153595089 153595228 FLNA_NM_001456.4_ex05 1 X 153595754 153595922 FLNA_NM_001110556.2_ex04 1 X 153595754 153595922 FLNA_NM_001456.4_ex04 ...
正确实现方法
错误原因
你尝试的代码中,assign(tmp=WRGL4_hg19["INFO"].str.split())是把拆分后的列表存入新列tmp,但后续explode("INFO")是对原始未拆分的INFO列操作,因此无法实现展开效果。
方案一:直接拆分并展开INFO列
直接对INFO列执行拆分替换,再展开该列,无需临时列:
# 按逗号拆分INFO列为列表,替换原列后展开 result = WRGL4_hg19.assign(INFO=WRGL4_hg19["INFO"].str.split(",")).explode("INFO").reset_index(drop=True)
方案二:使用拆分+堆叠的链式写法
也可以用更灵活的链式调用实现:
# 拆分INFO列为多列,堆叠后合并回原数据 result = (WRGL4_hg19["INFO"] .str.split(",", expand=True) .stack() .reset_index(level=1, drop=True) .to_frame("INFO") .join(WRGL4_hg19.drop("INFO", axis=1)) .reset_index(drop=True))
效果验证
执行上述任意代码后,会得到预期的展开结果:每个INFO元素单独占一行,CHR、START、END列的内容与原行完全对应。
内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra
相关产品推荐
相关产品推荐

