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

如何在Pandas中将两列转为单列并保留对应关联数据?

问题描述

现有如下结构的Pandas DataFrame:

My Code AMy Code BCOL
1A1BC1O1L1
nan2BC2nanL2
3AnanC3O3nan

需要将其转换为以下目标结构:

CodeCOL
1AC1O1L1
1BC1O1L1
2BC2nanL2
3AC3O3nan

核心要求:转换操作仅依赖前两列My Code A和My Code B,与后续列的列名无关。

用于测试的DataFrame定义代码:

import pandas as pd
import numpy as np

data = {'My Code A':['1A', np.nan, '3A'],
        'My Code B':['1B', '2B', np.nan],
        'C':['C1', 'C2', 'C3'],
        'O': ['O1', np.nan, 'O3'],
        'L': ['L1', 'L2', np.nan]
        }
df1 = pd.DataFrame(data)
解决方案

以下两种方法均不依赖后续列的具体名称,仅针对前两列处理:

方法1:使用melt实现

# 获取前两列的列名
code_cols = df1.columns[:2]
# 融合前两列,保留其余列的行数据
melted_df = df1.melt(
    id_vars=df1.columns.difference(code_cols),
    value_vars=code_cols,
    value_name='Code'
)
# 过滤空值并整理列结构
result_df = melted_df.dropna(subset=['Code']).drop(columns='variable')
# 调整列顺序,将Code列置于首位
result_df = result_df[['Code'] + df1.columns.difference(code_cols).tolist()]

方法2:使用stack实现(更简洁)

code_cols = df1.columns[:2]
# 将非代码列设为索引,堆叠前两列展开非空值
stacked_df = df1.set_index(df1.columns.difference(code_cols).tolist())[code_cols].stack().reset_index(name='Code')
# 调整列顺序
result_df = stacked_df[['Code'] + df1.columns.difference(code_cols).tolist()]

两种方法执行后,result_df均为目标结构的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:23:12