
本文详细阐述了如何高效且优雅地将外部变长列表数据作为新列添加到现有Pandas DataFrame中,同时避免因频繁操作或数据长度不一致导致的性能碎片化警告。通过结合Python的`itertools.zip_longest`函数处理数据对齐与填充,并利用Pandas的`pd.concat`进行一次性合并,本教程提供了一种在处理动态或迭代数据添加场景下的优化策略,确保数据处理的效率和稳定性。
在数据分析和处理中,我们经常需要将外部数据源集成到现有的Pandas DataFrame中。一个常见的挑战是,当需要添加的数据以列表形式存在,并且这些列表的长度可能不一致时。更复杂的是,当这种添加操作需要在循环中重复执行,或者涉及大量列时,不当的处理方式可能导致显著的性能问题,例如Pandas发出的“DataFrame is highly fragmented”(DataFrame高度碎片化)警告。本教程将介绍一种健壮且高效的方法来解决这一问题。
考虑以下场景:我们有一个列名列表(list1)和一个包含多个子列表的列表(list2),其中每个子列表代表一行数据,且它们的长度可能不同。我们的目标是将list1中的元素作为新的列名,list2中的数据填充到这些新列中,并与现有DataFrame的行对齐,对于缺失的数据点(由于子列表长度不足)填充一个默认值(例如0)。
直接使用类似df[list1] = pd.DataFrame(list2, index=df.index)的方式,虽然在某些简单情况下可行,但当list2中的子列表长度不一致时,会遇到数据对齐问题。更重要的是,在循环中反复对DataFrame进行列的增删改查操作,会导致DataFrame的内存布局变得碎片化,从而降低后续操作的性能。
为了高效地解决上述问题,我们将利用Python标准库中的itertools.zip_longest函数来处理变长列表的对齐和填充,然后通过构建一个完整的临时DataFrame并使用pd.concat进行一次性合并,从而避免性能碎片化。
首先,我们定义初始的列名列表、数据列表和现有的DataFrame:
import pandas as pd
from itertools import zip_longest
# 列名列表
list1 = ['col1', 'col2', 'col3', 'col4']
# 变长数据列表
list2 = [[1, 2, 3], [2, 3], [1, 8, 4, 3], [22, 35, 32], [65], [2, 45, 55]]
# 现有DataFrame
df = pd.DataFrame([
['Alex', 33, 'Male'],
['Marly', 28, 'Female'],
['Charlie', 30, 'Female'],
['Mimi', 37, 'Female'],
['James', 44, 'Male'],
['Jone', 25, 'Male']
], columns=['Name', 'Age', 'Gender'])
print("原始DataFrame:")
print(df)原始DataFrame df 如下:
Name Age Gender 0 Alex 33 Male 1 Marly 28 Female 2 Charlie 30 Female 3 Mimi 37 Female 4 James 44 Male 5 Jone 25 Male
itertools.zip_longest是处理多个可迭代对象时,当它们长度不一致时进行填充的强大工具。在这里,我们将利用它来确保list2中的每个子列表都被填充到与list1相同(或至少是list2中最长子列表)的长度。
Zyro AI Background Remover
Zyro推出的AI图片背景移除工具
145
查看详情
核心思想是使用zip(*zip_longest(*list2, fillvalue=0))这个模式。让我们逐步解析:
# 使用itertools.zip_longest处理变长列表,并填充缺失值
# zip(*zip_longest(*list2, fillvalue=0)) 的作用是:
# 1. zip_longest(*list2, fillvalue=0) 先将list2进行“转置”,同时用fillvalue填充短的子列表
# 例如:list2 = [[1,2,3], [2,3]] -> (1,2), (2,3), (3,0)
# 2. 外层的 zip(*...) 再将结果“转置”回来,此时每个原始子列表都被填充到了最长子列表的长度
# 例如:(1,2), (2,3), (3,0) -> (1,2,3), (2,3,0)
padded_data_rows = [
dict(zip(list1, vals))
for vals in zip(*zip_longest(*list2, fillvalue=0))
]
# 将处理后的数据转换为新的DataFrame
new_cols_df = pd.DataFrame(padded_data_rows)
print("\n新生成列的DataFrame:")
print(new_cols_df)new_cols_df 的输出将是:
col1 col2 col3 col4 0 1 2 3 0 1 2 3 0 0 2 1 8 4 3 3 22 35 32 0 4 65 0 0 0 5 2 45 55 0
可以看到,list2中的每个子列表都已根据list1的长度(或list2中最长子列表的长度)进行了填充,缺失值用0表示。
最后一步是将原始DataFrame df 与新生成的列DataFrame new_cols_df 进行合并。我们使用pd.concat函数,并指定axis=1表示按列合并。
# 使用pd.concat将原始DataFrame与新列DataFrame合并
out_df = pd.concat([df, new_cols_df], axis=1)
print("\n最终合并后的DataFrame:")
print(out_df)最终的DataFrame out_df 如下:
Name Age Gender col1 col2 col3 col4 0 Alex 33 Male 1 2 3 0 1 Marly 28 Female 2 3 0 0 2 Charlie 30 Female 1 8 4 3 3 Mimi 37 Female 22 35 32 0 4 James 44 Male 65 0 0 0 5 Jone 25 Male 2 45 55 0
这正是我们期望的结果。
本教程提供了一种在Pandas中高效处理变长列表数据并将其作为新列添加到DataFrame的专业方法。通过巧妙地结合itertools.zip_longest进行数据对齐和填充,并利用pd.DataFrame和pd.concat进行批处理式合并,我们不仅解决了数据长度不一致的问题,还显
著提升了性能,避免了常见的DataFrame碎片化警告。这种方法尤其适用于需要动态生成和集成数据到DataFrame的复杂场景。
以上就是高效集成变长列表数据至Pandas DataFrame:避免性能碎片化的详细内容,更多请关注其它相关文章!
相关文章:
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
创客贴用户入口官网登录 创客贴网页版电脑版系统
J*aScript 字符串标签转换:使用正则表达式高效替换
优化Log4j2控制台输出性能:解决异步日志瓶颈
微信客户端如何收红包_微信客户端接收红包使用教程
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
AO3最新入口2025公告_AO3中文官网合集
AO3镜像入口大全 AO3网页版内容访问全集
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
解决Bootstrap卡片顶部边距导致背景图下移的问题
163邮箱登录密码 163邮箱忘记密码找回
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
小米14应用无法联网原因分析_小米14网络权限修复
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
抖音创作助手登录入口_抖音创作辅助工具官网直达
AO3访问入口汇总 AO3网页版同人作品一键直达
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
J*aScript中管理异步API调用:确保操作顺序与数据一致性
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
在哪找SublimeJ远程工具_SFTP插件配置教程
在Qt QML中通过Python字典动态更新TextEdit内容的教程
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
顺丰快递查单号物流信息 顺丰快递小程序查询入口
机器学习中对数变换预测结果的反向还原
实现全屏滚动与导航点:专业教程
解决Tabulator日期时间排序问题的专业指南
mc.js官网登录入口 mc.js官方登录入口最新版
小米汽车11月交付量突破40000台!雷军:将继续努力
精准捕获:如何在页面中监听除特定元素外的所有点击事件
极兔快递快件信息查询系统 极兔快递官网运单号追踪
J*aScript对象创建方式_J*aScript设计模式应用
ArrayList与LinkedList核心操作的Big-O复杂度分析
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
Walmart退货API集成指南:PHP cURL实现与常见问题解析
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
Excel文件在线转换快速入口 Excel在线格式转换网站
汽水音乐在线解析 汽水音乐在线解析入口
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
c++20的std::jthread是什么_c++可中断线程与RAII式管理
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
在WordPress中通过REST API访问受BasicAuth保护的站点内容