如何将特定列的非空值转换为新行并重命名类型字段

阿瑶君_9087

阿瑶君_9087

2026-07-11

683人浏览

原创

如何将特定列的非空值转换为新行并重命名类型字段

本文介绍使用 pandas 的 melt、stack 和 explode 等方法,将 aka、lqaka 等辅助名称列中非空值“下移”为独立行,同时将原行保留为 primary 类型,并动态设置 name type 字段为对应列名(如 aka/lqaka),其他列(如 other)仅在 primary 行保留值。

本文介绍使用 pandas 的 melt、stack 和 explode 等方法,将 aka、lqaka 等辅助名称列中非空值“下移”为独立行,同时将原行保留为 primary 类型,并动态设置 name type 字段为对应列名(如 aka/lqaka),其他列(如 other)仅在 primary 行保留值。

在数据清洗与标准化场景中,常需将宽表中多个“别名类”列(如 AKA、LQAKA)展开为长格式——即每个非空别名生成一条新记录,紧随其所属的主记录(Primary)之后,且新记录的 Name Type 自动设为对应列名,而其他辅助列(如 Other)仅保留在主行中,别名行留空。这种结构对后续分组、排序或导入下游系统(如 CRM 或图谱数据库)至关重要。

以下提供三种稳健、可扩展的实现方案,均基于 pandas 1.5+,兼顾简洁性与泛化能力。

✅ 方案一:melt + dropna + 后处理(推荐,逻辑清晰)

import pandas as pd

data = {
    'Name Type': ["Primary", "Primary", "Primary"],
    'Full Name': ["John Snow", "Daenerys Targaryen", "Brienne Tarth"], 
    'AKA': ["Aegon Targaryen", None, None],
    'LQAKA': ["The Bastard of Winterfell", "Mother of Dragons", None],
    'Other': ["Info", "Info", "Info"]
}
df = pd.DataFrame(data)

# 步骤1:以固定列(Name Type, Other)为标识,熔化其余列
out = (df.melt(['Name Type', 'Other'], ignore_index=False)
         .dropna(subset='value')  # 移除 value 为 None 的行
         .sort_index(kind='stable', ignore_index=True)  # 按原始顺序稳定排序
         .rename(columns={'value': 'Full Name'})  # 统一名称字段
      )

# 步骤2:识别非 Full Name 行(即来自 AKA/LQAKA 的行),重赋 Name Type 并清空 Other
mask = out['variable'] != 'Full Name'
out.loc[mask, 'Name Type'] = out.pop('variable')  # 将列名转为 Name Type
out.loc[mask, 'Other'] = ''  # 清空辅助列

print(out)

输出:

  Name Type Other                  Full Name
0   Primary  Info                  John Snow
1       AKA                        Aegon Targaryen
2     LQAKA        The Bastard of Winterfell
3   Primary  Info         Daenerys Targaryen
4     LQAKA                Mother of Dragons
5   Primary  Info              Brienne Tarth

✅ 优势:语义明确,易于调试;支持任意数量的“别名列”,只需调整 melt 的 id_vars 参数。

Learning Prompt
Learning Prompt

Learning Prompt是一款AI提示词工具,免费的AI提示词学习平台。

下载

✅ 方案二:stack(更简洁,自动跳过 NaN)

out = (df.set_index(['Name Type', 'Other'])
         .stack()  # 自动忽略 NaN,返回 MultiIndex Series
         .reset_index(name='Full Name')
         .rename(columns={'level_2': 'Name Type'})
      )

# 将原 Full Name 行的 Name Type 保持为 Primary,其余设为列名
mask = out['Name Type'] != 'Full Name'
out.loc[mask, 'Other'] = ''
# 注意:此处需手动恢复 Primary 行的 Name Type(因 stack 会覆盖)
out.loc[~mask, 'Name Type'] = 'Primary'

# 重排列顺序确保一致性
out = out[['Name Type', 'Full Name', 'Other']]

该方式代码更短,但需额外处理 Name Type 的原始值还原,适合列结构固定且无嵌套需求的场景。

⚠️ 扩展:处理多列与嵌套列表(如 AKA 为 list)

若 AKA 或 LQAKA 列含列表(如 ["Aegon Targaryen", "Lord Snow"]),需增加 .explode():

# 假设 AKA/LQAKA 可能为 list 或 scalar
cols_to_melt = df.columns.difference(['Full Name'])  # 动态识别所有非 Full Name 列
out = (df.melt(['Name Type', 'Other'], ignore_index=False)
         .dropna(subset='value')
         .sort_index(kind='stable', ignore_index=True)
         .rename(columns={'value': 'Full Name'})
         .explode('Full Name', ignore_index=True)  # 展开列表项为多行
      )

mask = out['variable'] != 'Full Name'
out.loc[mask, 'Name Type'] = out.pop('variable')
out.loc[mask, ['Other']] = ''
out = out[['Name Type', 'Full Name', 'Other']]

? 关键注意事项

  • 索引稳定性:sort_index(kind='stable') 确保原始行序不被破坏,避免 Primary 与别名错位;
  • 列名保留:id_vars 中应包含所有需在 Primary 行完整保留的列(如 Other, Other2 等),其余列为待熔化列;
  • 空值处理:dropna(subset='value') 是安全前提,务必确认 None/np.nan 已统一;
  • 性能提示:对百万级数据,优先用 stack(底层 C 优化);需调试时选 melt 更直观。

最终结果严格满足需求:每条 Primary 记录后紧跟其非空别名行,Name Type 准确映射来源列,辅助列仅 Primary 行填充,结构规整、语义清晰,可直接用于报表或 ETL 流程。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

2025.12.04

320

15

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

2026.01.31

252

21

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

2026.04.13

531

25

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

0

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习