如何实现Multicolumn Explode:保留行标识、过滤空值将多列合并为单列
Pandas 多列非空值展开为多行(Multicolumn Explode)实现
核心实现
不需要逐列写循环,用pandas内置的melt接口就能搞定,不管值列是20列还是30列都不用手动枚举列名,代码可以直接复用:
import pandas as pd import numpy as np # -------------------------- # 这里替换成你自己的DataFrame # -------------------------- # df = pd.read_csv("your_data.csv") # 核心转换逻辑 result = ( df.melt( id_vars="Identifier", # 指定标识列,不参与展开 value_name="Var", ignore_index=False ) .drop(columns=["variable"]) # 删掉自动生成的原列名列 .dropna(subset=["Var"]) # 过滤所有空值记录 .sort_index() # 保持原表行优先的展开顺序 .reset_index(drop=True) )
效果验证
用题目给出的测试样例跑的话,输入数据结构:
| Identifier | Column1 | Column2 | Column3 | Column4 |
|---|---|---|---|---|
| 1 | Dog | Cow | Sheep | Dinosaur |
| 2 | Dog | Pig | NaN | NaN |
| 3 | Bull | Cow | Elephant | NaN |
运行后输出结果完全匹配要求,共9行:
| Identifier | Var |
|---|---|
| 1 | Dog |
| 1 | Cow |
| 1 | Sheep |
| 1 | Dinosaur |
| 2 | Dog |
| 2 | Pig |
| 3 | Bull |
| 3 | Cow |
| 3 | Elephant |
注意点
- 代码自动兼容各类空值:
np.nan、None、pandas 原生的pd.NA都会被自动过滤 - 如果不需要严格保持原行顺序,可以删掉
ignore_index=False和.sort_index()两行,运行速度会更快 - 如果有多个标识列,只需要给
id_vars传列名列表就行,比如id_vars=["Identifier", "Date"]
内容的提问来源于stack exchange,提问作者Random Person
相关产品推荐
相关产品推荐

