将指定列的非空值拆分为新行并重映射类型标签

星萱小哥_6732

星萱小哥_6732

2026-07-11

230人浏览

原创

将指定列的非空值拆分为新行并重映射类型标签

本文介绍如何使用 pandas 的 melt、stack 或 explode 等方法,将 dataframe 中特定列(如 aka、lqaka)的非空值“下移”为独立行,并将其对应类型(aka/lqaka)赋给 name type 列,同时保留原始主行及其他辅助列的结构完整性。

本文介绍如何使用 pandas 的 melt、stack 或 explode 等方法,将 dataframe 中特定列(如 aka、lqaka)的非空值“下移”为独立行,并将其对应类型(aka/lqaka)赋给 name type 列,同时保留原始主行及其他辅助列的结构完整性。

在数据清洗与标准化场景中,常需将宽表中多个别名类字段(如 AKA、LQAKA)展开为长格式——即每个非空别名独占一行,并继承原始记录的关键标识(如 Name Type),同时将原字段名转化为新的类型标签。本教程提供三种稳健、可扩展的实现方案。

✅ 推荐方案:melt + dropna + 重映射

这是最清晰、易调试的方法,适用于含任意数量固定列(如 Other, Other2 等)的通用场景:

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),其余列熔化为长格式
cols_to_keep = ['Name Type', 'Other']
out = (df.melt(cols_to_keep, ignore_index=False)
       .dropna(subset='value')  # 自动过滤 None/NaN
       .sort_index(kind='stable', ignore_index=True)
       .rename(columns={'value': 'Full Name'}))

# 步骤2:识别非 Full Name 行,用 variable 列填充 Name Type,并清空其他辅助列
m = out['variable'] != 'Full Name'
out.loc[m, 'Name Type'] = out.pop('variable')
out.loc[m, cols_to_keep[1:]] = ''  # 清空除 Name Type 外的保留列(如 Other)

# 步骤3:确保列序一致(Name Type, Full Name, 其他保留列)
result = out[['Name Type', 'Full Name'] + cols_to_keep[1:]].reset_index(drop=True)
print(result)

输出:

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

⚡ 简洁替代:stack 一步到位

若仅需处理 Full Name、AKA、LQAKA 三列,且辅助列固定为 Name Type 和 Other,stack 更简洁高效:

稿定AI
稿定AI

一款融合AI图像生成与智能编辑能力的在线设计工具,可辅助完成图片重绘、线稿处理和人物视觉优化等创作任务。

下载
out = df.set_index(['Name Type', 'Other']).stack().reset_index(name='Full Name')
m = out['level_2'] != 'Full Name'
out.loc[m, 'Name Type'] = out.pop('level_2')
out.loc[m, 'Other'] = ''
result = out[['Name Type', 'Full Name', 'Other']].reset_index(drop=True)

? 注意:stack() 会自动忽略 NaN,无需显式 dropna;但要求索引列无重复或缺失,否则需提前校验。

? 扩展支持:列表型字段(如 AKA 为字符串列表)

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

# 假设 AKA/LQAKA 可能为 list 或 scalar
out = (df.melt(cols_to_keep, ignore_index=False)
       .dropna(subset='value')
       .sort_index(kind='stable', ignore_index=True)
       .rename(columns={'value': 'Full Name'})
       .explode('Full Name', ignore_index=True))  # 展开列表项为多行

m = out['variable'] != 'Full Name'
out.loc[m, 'Name Type'] = out.pop('variable')
out.loc[m, cols_to_keep[1:]] = ''
result = out[['Name Type', 'Full Name'] + cols_to_keep[1:]].reset_index(drop=True)

? 关键注意事项

  • 列名敏感性:melt 中 id_vars 必须明确指定需保留的“主键列”,避免误熔化;
  • 空值处理:dropna(subset='value') 是安全底线,但若存在空字符串 '' 需额外 .replace('', pd.NA).dropna(...);
  • 顺序保证:sort_index(kind='stable') 确保原始行序不因熔化打乱;
  • 性能提示:对超大表(百万级),优先用 stack(底层优化);需灵活列选择时用 melt 更可控。

该模式广泛适用于人员别名、产品多规格、地址多类型等“一主多辅”结构的规范化转换,是 pandas 数据重塑的经典实践。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1651

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4124

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1649

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23817

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2907

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2947

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2283

5

热门下载

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

精品课程

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

共6课时 | 54.6万人学习

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

共89课时 | 133.4万人学习