0

0

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

心靈之曲

心靈之曲

发布时间: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,只需一行链式操作:

问问小宇宙
问问小宇宙

问问小宇宙是小宇宙团队出品的播客AI检索工具

下载
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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

73

2025.12.04

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

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

4

2026.01.31

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

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

311

2023.10.31

php数据类型
php数据类型

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

222

2025.10.31

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

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

6

2026.02.12

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

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

399

2023.09.04

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

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

865

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

444

2024.06.27

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

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

4

2026.02.12

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号