讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用 Pandas 高效地从长格式数据构建宽格式 DataFrame

浅枫大大_3563

浅枫大大_3563

发布时间:2026-02-12 20:52:45

|

120人浏览过

|

来源于php中文网

原创

如何用 Pandas 高效地从长格式数据构建宽格式 DataFrame

本文介绍如何基于原始长格式 dataframe(含 obj_id、属性名、属性值三列),快速筛选并透视指定属性(如 weight、height 等),生成结构清晰的宽格式新 dataframe,避免低效循环,提升代码可读性与执行性能。

在实际数据分析中,尤其是从关系型数据库导出的数据,常以“长格式”(long format)存储:每行仅记录一个对象(obj_id)的一项属性(如 Column B 为属性名,Column C 为对应值)。但后续建模或可视化往往需要“宽格式”(wide format)——即每个属性独占一列,每行代表一个对象的完整快照。例如,将 obj_id, Column B, Column C 的三列结构,转换为 obj_id, weight, height, eye_color 等多列结构。

直接使用 df.apply() + 内层 iterrows()(如原问题中的 myfunction)不仅语法冗长、逻辑易错,更因 Python 层面循环严重拖慢性能,尤其在处理数万行以上数据时尤为明显。Pandas 提供了专为该场景设计的高效向量化方案:条件过滤 + pivot。

✅ 推荐做法:先过滤再透视(推荐)

假设原始 DataFrame 名为 df,结构如下:

import pandas as pd

df = pd.DataFrame({
    'obj_id': [1, 1, 1, 2, 2, 3, 4],
    'Column B': ['weight', 'height', 'eye_color', 'weight', 'height', 'weight', 'weight'],
    'Column C': [150, 5.8, 'blue', 160, 6.1, 140, 150]
})

要提取 weight 属性并构建新 DataFrame,只需一行链式操作:

out = (df.query('`Column B` == "weight"')
         .pivot(index='obj_id', columns='Column B', values='Column C')
         .reset_index()
         .rename_axis(columns=None))

输出结果为:

   obj_id  weight
0       1     150
1       2     160
2       3     140
3       4     150
? 注意:列名 Column B 含空格,需用反引号 `Column B` 包裹,否则 query() 会报错。

? 扩展支持多个属性(如 weight + height + eye_color)

若需同时提取多个属性列,只需扩展过滤条件,并利用 pivot 的天然能力一次性完成宽表构建:

# 指定需保留的属性列表
keep_attrs = ['weight', 'height', 'eye_color']

out = (df.loc[df['Column B'].isin(keep_attrs)]
         .pivot(index='obj_id', columns='Column B', values='Column C')
         .reset_index()
         .rename_axis(columns=None))

该方法自动对 obj_id 去重(若某 obj_id 缺失某属性,则对应单元格为 NaN),结果列顺序与 keep_attrs 中顺序一致(Pandas 2.0+ 支持 sort=False 进一步确保顺序)。

⚠️ 注意事项与最佳实践

  • 避免先 pivot 后筛选:如 df.pivot(...)[['weight']],会在内存中先生成包含所有属性(可能上百列)的宽表,再丢弃不需要的列,造成显著内存浪费和性能下降。
  • 处理缺失值:若某些 obj_id 缺少指定属性,pivot 默认填充 NaN;如需填充默认值(如 0 或 'N/A'),可在 pivot 后接 .fillna(0)。
  • 数据类型统一:pivot 后各列类型由原始 Column C 决定。若需强制转换(如 weight 列转为整型),可添加 .astype({'weight': 'int'}) —— 注意需确保无 NaN,否则需先 .fillna() 或用 Int64(支持空值的整型)。
  • 去重保障:确保 (obj_id, Column B) 组合唯一。若存在重复(如同一 obj_id 有两条 weight 记录),pivot 将报错 ValueError: Index contains duplicate entries。此时应先用 drop_duplicates(subset=['obj_id', 'Column B'], keep='last') 显式去重。

✅ 总结

用 query() 或 loc 先精准筛选目标属性行,再通过 pivot() 一次性完成索引重塑与列展开,是构建宽格式 DataFrame 的标准、高效、可维护方案。它完全规避了 Python 循环,充分利用 Pandas 底层优化,代码简洁且语义清晰。对于 5–10 个常用属性的提取任务,此模式可轻松扩展,是生产环境中的首选实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

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

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

340

2025.12.04

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

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

272

2026.01.31

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

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

751

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3251

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

542

2026.02.12

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1158

2023.09.04

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

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

1789

2023.07.31

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn