如何在Pandas中将两列转为单列并保留对应关联数据?
问题描述
现有如下结构的Pandas DataFrame:
| My Code A | My Code B | C | O | L |
|---|---|---|---|---|
| 1A | 1B | C1 | O1 | L1 |
| nan | 2B | C2 | nan | L2 |
| 3A | nan | C3 | O3 | nan |
需要将其转换为以下目标结构:
| Code | C | O | L |
|---|---|---|---|
| 1A | C1 | O1 | L1 |
| 1B | C1 | O1 | L1 |
| 2B | C2 | nan | L2 |
| 3A | C3 | O3 | nan |
核心要求:转换操作仅依赖前两列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
相关产品推荐
相关产品推荐

