Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
高效地将变长列表数据整合到Pandas DataFrame中:避免性能碎片化_创想鸟

高效地将变长列表数据整合到Pandas DataFrame中:避免性能碎片化

高效地将变长列表数据整合到Pandas DataFrame中:避免性能碎片化

本文旨在提供一种高效且健壮的方法,用于将具有不同长度的列表数据作为新列添加到现有pandas dataframe中,特别是在循环场景下避免dataframe碎片化带来的性能问题。通过巧妙结合使用`itertools.zip_longest`进行数据填充和`pd.concat`进行高效合并,本教程将展示如何灵活处理变长数据,确保数据整合的效率和准确性。

在数据分析和处理中,我们经常需要将新的数据列动态地添加到现有的Pandas DataFrame中。然而,当这些新数据来源于列表,并且其内部子列表长度不一致时,直接操作可能会遇到挑战,尤其是在循环中重复添加大量列时,可能导致DataFrame碎片化,从而引发性能警告甚至错误。本教程将详细介绍如何优雅地解决这一问题。

挑战:变长列表与DataFrame的整合

假设我们有以下两组数据:

list1: 包含新列的名称,例如 [‘col1’, ‘col2’, ‘col3’, ‘col4’]。list2: 包含对应新列的值,其内部子列表的长度可能不同,例如 [[1, 2, 3], [2, 3], [1, 8, 4, 3], [22, 35, 32], [65], [2, 45, 55]]。

我们还有一个初始的Pandas DataFrame df:

import pandas as pddf = 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)

期望的结果是,将list1作为新列名,list2作为对应行的值,添加到df中,其中list2中较短的子列表应使用默认值(例如0)进行填充,以匹配list1的长度。

      Name  Age  Gender  col1  col2  col3  col40     Alex   33    Male     1     2     3     01    Marly   28  Female     2     3     0     02  Charlie   30  Female     1     8     4     33     Mimi   37  Female    22    35    32     04    James   44    Male    65     0     0     05     Jone   25    Male     2    45    55     0

传统方法的问题

一种直观但可能效率不高的方法是尝试直接将list2转换为DataFrame并赋值:

# 假设 list2 已经经过处理,使其内部子列表长度一致# df[list1] = pd.DataFrame(list2, index=df.index)

然而,这种方法存在几个问题:

长度不匹配: 如果list2中的子列表长度与list1的长度不一致,或者list2的行数与df的行数不一致,直接赋值会报错。性能碎片化: 更重要的是,当这种操作在循环中频繁执行,每次都添加新列时,Pandas DataFrame可能会因为内部内存重分配而变得“碎片化”,导致性能显著下降,并可能触发Performance warning DataFrame is highly fragmented警告。

为了避免这些问题,我们需要一个更健壮和高效的解决方案。

解决方案:结合itertools.zip_longest与pd.concat

该解决方案的核心思想是:

使用itertools.zip_longest对list2中的子列表进行填充,使其所有子列表的长度与所需列数(即list1的长度)保持一致。将处理后的数据转换为适合构建新DataFrame的字典列表。利用pd.concat将新生成的DataFrame与原始DataFrame进行横向合并,这是Pandas中推荐的添加多列的高效方式。

步骤详解与示例代码

首先,导入必要的库和定义初始数据:

from itertools import zip_longestimport pandas as pd# 原始数据list1 = ['col1', 'col2', 'col3', 'col4']list2 = [[1, 2, 3], [2, 3], [1, 8, 4, 3], [22, 35, 32], [65], [2, 45, 55]]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'])

接下来是核心处理逻辑:

# 1. 使用 zip_longest 填充 list2 中的子列表# 这一步的目的是确保 list2 中的每个子列表都具有相同的长度,# 且该长度与 list1 (列名) 的长度匹配,不足部分用 fillvalue 填充。# 具体操作:#   - zip_longest(*list2, fillvalue=0) 将 list2 视为多行数据,#     进行“转置”并填充,例如 [1,2,3], [2,3] 会变成 (1,2), (2,3), (3,0)。#   - 外层的 zip(*...) 再次进行“转置”,将填充后的数据恢复到#     原始的“行”结构,但现在所有行都已补齐到最大长度。# 示例:# list2_padded = [[1, 2, 3, 0], [2, 3, 0, 0], [1, 8, 4, 3], [22, 35, 32, 0], [65, 0, 0, 0], [2, 45, 55, 0]]list2_padded = list(zip(*zip_longest(*list2, fillvalue=0)))# 2. 将填充后的数据与列名 list1 结合,创建字典列表# 对于 list2_padded 中的每一行 (vals),将其与 list1 (列名) 进行 zip,# 然后转换为字典,形成 {col_name: value} 的结构。# 示例:# [{'col1': 1, 'col2': 2, 'col3': 3, 'col4': 0}, ...]new_data_dicts = [dict(zip(list1, vals)) for vals in list2_padded]# 3. 从字典列表创建新的 DataFramenew_df_cols = pd.DataFrame(new_data_dicts)# 4. 使用 pd.concat 将新旧 DataFrame 横向合并# axis=1 表示按列合并。这是添加新列的高效方式,避免了碎片化。out = pd.concat([df, new_df_cols], axis=1)print("n整合后的DataFrame:")print(out)

代码输出:

原始DataFrame:     Name  Age  Gender0    Alex   33    Male1   Marly   28  Female2  Charlie   30  Female3     Mimi   37  Female4   James   44    Male5    Jone   25    Male整合后的DataFrame:      Name  Age  Gender  col1  col2  col3  col40     Alex   33    Male     1     2     3     01    Marly   28  Female     2     3     0     02  Charlie   30  Female     1     8     4     33     Mimi   37  Female    22    35    32     04    James   44    Male    65     0     0     05     Jone   25    Male     2    45    55     0

注意事项与总结

fillvalue的选择: 在zip_longest中,fillvalue参数用于填充较短序列的缺失值。根据你的数据类型和业务需求,可以选择合适的填充值(例如0、None、空字符串等)。如果新列可能包含非数值数据,则需要考虑填充值的数据类型兼容性。效率提升: 使用pd.concat是Pandas中推荐的合并DataFrame的方法,尤其是在添加多列或多行时。它通常比在循环中逐列赋值更高效,因为它会一次性构建新的DataFrame,而不是频繁地修改现有DataFrame的内存结构。这对于在循环中动态生成和添加大量列的场景尤为重要,能够有效避免性能碎片化警告。数据类型: 经过zip_longest填充后,如果fillvalue与原始数据类型不一致,新生成的DataFrame列的数据类型可能会变为更通用的类型(例如,整数和None混合可能导致对象类型)。如有需要,可以在合并后使用astype()进行类型转换。通用性: 此方法不仅适用于初始DataFrame,也适用于在循环中动态生成list1和list2的场景。每次循环迭代时,都可以使用这种方式生成新的列数据DataFrame,然后与主DataFrame进行合并,从而保持代码的简洁性和执行效率。

通过上述方法,我们可以优雅且高效地将变长列表数据整合到Pandas DataFrame中,同时避免常见的性能陷阱,确保数据处理流程的顺畅和可靠。

以上就是高效地将变长列表数据整合到Pandas DataFrame中:避免性能碎片化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1379806.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Python中让自定义类像列表、元组或字典一样工作
上一篇 2025年12月14日 20:58:15
解决Angular与Flask应用中用户个性化预订数据展示问题
下一篇 2025年12月14日 20:58:21

相关推荐

  • 如何在mysql中备份二进制日志

    答案:MySQL二进制日志备份可通过mysqlbinlog工具导出、直接复制日志文件、定时归档及结合mysqldump全量备份实现,需配合FLUSH LOGS和SHOW BINARY LOGS确保一致性,并制定保留策略以支持数据恢复。 在 MySQL 中,二进制日志(Binary Log)记录了所有…

    2026年9月23日
    100
  • RAID 0阵列对NVMe SSD性能的提升与数据安全风险分析

    RAID 0通过多NVMe SSD并行提升读写性能,理论速度翻倍且显著优化高负载响应,但无冗余导致任一硬盘故障即全阵列崩溃,数据恢复极难,仅建议用于可接受高风险的临时工作或性能优先场景,并必须配合外部备份。 raid 0通过将数据条带化分布在多个存储设备上,理论上可提升读写性能。在搭配nvme ss…

    用户投稿 2026年9月22日
    200
  • 如何在mysql中监控用户操作日志

    MySQL默认不记录用户操作日志,但可通过启用通用查询日志记录所有SQL操作,或使用二进制日志追踪数据变更,也可部署审计插件实现细粒度监控,结合独立账号管理和日志轮转策略提升安全性与可追溯性。 MySQL 本身不默认记录用户的所有操作日志,但可以通过启用特定的日志功能来实现对用户行为的监控。以下是几…

    2026年9月22日
    100
  • .com网站安全维护_保障.com网站稳定的措施

    答案:保障.com网站稳定需加强安全防护、定期备份、实时监控和应急准备。部署防火墙、更新系统、使用HTTPS、限制端口;制定自动备份并异地存储,定期恢复测试;利用监控工具检测可用性与异常流量,优化加载速度;建立应急流程,严格权限管理,定期演练。细节执行到位才能确保长期安全稳定运行。 确保.com网站…

    2026年9月21日
    300
  • 微信收藏内容丢失怎么办

    首先检查网络并刷新收藏页面,确认是否误删或设备缓存问题;接着通过电脑版或其他设备登录同一账号查看收藏是否同步存在;若内容仍可访问,说明数据未丢失,可重新同步;若已丢失且无备份,则无法通过官方途径单独恢复;建议将重要收藏导出为文档、截图或转发至“文件传输助手”,并定期同步至云笔记应用;同时保持微信更新…

    2026年9月21日
    300
  • Linux如何恢复被删除的用户数据

    恢复Linux被删数据需立即停用磁盘并使用photorec或extundelete等工具,结合快照或备份可提高恢复成功率。 恢复Linux中被删除的用户数据,并非易事,但并非完全不可能。可能性取决于数据被删除的方式、删除后系统是否被继续使用,以及是否采取了合适的预防措施。核心在于理解数据删除的机制,…

    2026年9月21日
    300
  • mysql如何启用binlog日志

    MySQL启用binlog需修改配置文件添加log-bin和server-id,重启服务后执行SHOW VARIABLES LIKE ‘log_bin’验证是否为ON,确认启用。 MySQL启用binlog日志需要修改配置文件并重启服务,同时可进行简单验证确保生效。以下是具体…

    2026年9月21日
    200
  • soul更新后聊天记录会没了吗_Soul更新后聊天记录说明

    更新后聊天记录是否保留取决于云同步与本地存储。一、确认账号已登录并开启“聊天记录同步”功能,重新登录以拉取云端数据;二、检查应用存储中数据是否为零,通过文件管理器查找本地历史记录文件尝试导入;三、若无法恢复,联系Soul客服提交问题表单并提供凭证,申请服务器端数据恢复。 如果您在使用Soul时遇到应…

    2026年9月20日
    000
  • mysql如何优化日志写入

    合理配置InnoDB日志参数、调整binlog写入策略、关闭非必要日志并优化存储硬件,可显著提升MySQL日志写入性能。 MySQL日志写入的优化直接影响数据库的性能和稳定性,尤其在高并发或大量写操作场景下。优化重点在于合理配置日志类型、调整刷盘策略、减少不必要的日志开销,并结合硬件提升I/O效率。…

    2026年9月12日
    200
  • ThinkPHP6数据备份与恢复:保护数据的安全

    ThinkPHP6数据备份与恢复:保护数据的安全 在Web应用的开发中,数据的安全是非常重要的一环。当我们的系统面临风险或者需要进行数据迁移的时候,数据备份与恢复就显得尤为重要。ThinkPHP6框架为我们提供了便捷的数据备份与恢复功能,本文将介绍如何利用ThinkPHP6进行数据备份与恢复,以保护…

    2026年9月12日
    000
  • iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验

    iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验

    若恢复iPhone数据后文件损坏,可依次尝试:使用易我或风云等修复工具修复特定文件;通过iCloud版本历史回滚至正常状态;用EaseUS或DiskGenius深度扫描并恢复数据;连接电脑执行chkdsk命令修复文件系统错误;最后验证备份完整性并重新创建备份以确保数据无损。 如果您在从备份中恢复iP…

    2026年9月12日 • 用户投稿
    200
  • 如何在mysql中恢复误删数据

    首先检查是否开启binlog并利用其恢复数据,若开启则通过mysqlbinlog解析日志并反向生成SQL还原;其次可从最近的备份文件如mysqldump中直接导入数据完成恢复。 在MySQL中误删数据后,恢复的关键在于是否有备份或开启了二进制日志(binlog)。如果没有做任何准备,恢复会非常困难甚…

    2026年9月12日
    100
  • win10便笺打不开或数据丢失如何恢复 _Win10便笺打不开数据恢复方法

    首先重启便笺应用,若无效则重置应用或使用SFC修复系统文件;可手动迁移数据文件或从云端同步恢复;最后尝试创建新用户账户解决问题。 如果您尝试打开Windows 10的便笺应用,但应用无法启动或提示数据丢失,则可能是由于应用故障、用户配置文件损坏或本地数据文件异常所致。以下是针对此问题的多种恢复方法。…

    2026年9月12日
    100
  • 如何在mysql中恢复数据避免重复导入

    答案:避免MySQL重复导入需根据场景选择策略。全量恢复时用TRUNCATE清空表后导入;增量恢复用INSERT ON DUPLICATE KEY UPDATE或REPLACE处理冲突;生产环境可借助临时表比对差量数据再导入;并通过幂等性设计如版本标记表防止重复执行,确保数据一致性。 在 MySQL…

    2026年9月11日
    100
  • windows怎么恢复文件的以前版本_Windows文件历史版本恢复方法

    可通过文件历史、卷影副本、命令提示符或第三方工具恢复被修改或损坏的文件。首先启用文件历史功能,通过“以前的版本”选项卡选择并还原特定时间点的文件;若未开启文件历史,可利用系统保护生成的卷影副本,在属性中浏览并复制早期版本;高级用户可通过管理员权限运行命令提示符,使用vssadmin list sha…

    2026年9月11日
    100
  • 幕布文档内容丢失了怎么恢复_幕布文档丢失恢复与数据找回方法

    首先检查自动保存版本,进入文档点击“历史版本”恢复;若删除则从回收站还原;通过多设备同步查找备份并导出;最后联系幕布客服提供账号信息寻求云端恢复支持。 如果您在使用幕布文档时发现内容丢失,可能是由于误操作、网络中断或软件异常导致未保存的内容消失。以下是针对此类问题的恢复步骤: 本文运行环境:MacB…

    2026年9月11日
    200
  • mac怎么找回废纸篓清空的文件_Mac恢复废纸篓已清空文件方法

    首先使用时间机器恢复,若未启用则尝试iCloud云盘“最近删除”功能找回30天内文件,最后可借助第三方软件如Disk Drill扫描磁盘恢复已清空废纸篓的丢失数据。 如果您发现Mac上废纸篓已被清空,导致重要文件丢失,这通常意味着文件已从系统常规存储区域移除。以下是针对此问题的多种恢复方案: 本文运…

    2026年9月11日
    100
  • 华为Pura 70相机无法对焦怎么办 华为Pura 70镜头校准技巧

    华为Pura 70相机无法对焦时,先清洁镜头、重启手机、切换拍摄模式排除基础问题;再通过手动点击对焦、锁定AE/AF、关闭AI摄影大师进行设置调整;若仍无效,检查伸缩镜头是否正常、进入安全模式排查应用冲突,最后可备份数据恢复出厂设置;若问题持续,需前往华为服务中心检测,可能存在马达或传感器硬件故障。…

    2026年9月10日
    100
  • Laravel模型块处理?数据块怎样分批处理?

    分批处理Laravel模型数据可避免内存溢出和数据库性能瓶颈,核心方法是使用chunk()或更高效的chunkById()将大数据集拆分为小批次迭代处理,推荐结合预加载、事务、队列及垃圾回收等策略提升性能与可靠性。 Laravel模型的数据分批处理,核心目的在于避免一次性加载过大数据集引发的内存溢出…

    2026年9月10日
    100
  • Laravel如何优化数据库查询_数据库性能调优技巧

    Laravel应用中最常见的数据库性能瓶颈包括N+1查询、缺少索引、SELECT 未指定列、不合理的大事务及复杂JOIN操作。N+1问题因循环中频繁查询关联数据导致数据库负载激增,可通过Eloquent的with()预加载解决;缺少索引会使WHERE、JOIN或ORDER BY操作引发全表扫描,应为…

    2026年9月9日
    000

发表回复

登录后才能评论
关注微信