当在 pandas dataframe 中通过循环或重复赋值创建大量新列时,可能会遇到 `performancewarning: dataframe is highly fragmented` 警告。此警告表明 dataframe 内存布局变得碎片化,导致性能下降。本文将深入探讨此警告的成因,并提供使用 `pd.concat` 方法高效、批量创建新列的专业解决方案,从而避免碎片化并提升数据处理效率。
PerformanceWarning: DataFrame is highly fragmented 警告通常在您对现有 DataFrame 反复执行列插入操作时出现。在 Pandas 中,DataFrame 的内存布局通常是为连续性访问优化的。当您使用 df['new_col'] = ... 这种方式逐个添加大量新列时,Pandas 可能会在底层执行多次内存重新分配操作。每次重新分配都可能导致数据在内存中的存储不再连续,从而形成“碎片”。
这种碎片化现象会带来两个主要问题:
使用的内存量高于理论值,因为一些小的空闲块可能无法被有效利用。考虑一个常见场景:从一个包含长字符串的列中,根据不同位置切片并生成数百甚至近千个新列。以下是导致警告的典型代码模式:
import pandas as pd
import numpy as np
import string
# 模拟一个包含长字符串的DataFrame
np.random.seed(0)
df_fragmented = pd.DataFrame({
"long_string": ["".join(np.random.choice(
[*string.printable[:62]], size=5000)) for _ in range(10000)]
})
def parse_long_string_fragmented(df):
# 假设需要从 long_string 中切片出 972 个新列
# 这是一个简化示例,实际可能需要更多列
df['a001'] = df['long_string'].str[0:2]
df['a002'] = df['long_string'].str[2:4]
df['a003'] = df['long_string'].str[4:13]
# ... 更多类似的列赋值操作,直到 a972
df['a972'] = df['long_string'].str[4994:]
return df
# 调用此函数时,会触发 PerformanceWarning
# result_fragmented = parse_long_string_fragmented(df_fragmented.copy())上述代码中,每次 df['aXXX'] = ... 都会尝试在现有 DataFrame 中插入新列。当列数非常多时,这种重复的插入操作会显著增加 DataFrame 的碎片化程度,并最终触发 PerformanceWarning。
为了避免 DataFrame 碎片化并提高性能,最佳实践是批量创建所有新列,然后一次性将它们添加到原始 DataFrame 中。pd.concat 函数是实现这一目标的高效工具。
核心思想是:
以下是使用 pd.concat 解决上述问题的具体实现:
import pandas as pd
import numpy as np
import string
# 1. 准备示例数据
np.random.seed(0)
df = pd.DataFrame({
"long_string": ["".join(np.random.choice(
[*string.printable[:62]], size=5000)) for _ in range(10000)]
})
# 2. 定义切片规则 (使用字典更具可读性)
# 这是一个包含 972 个切片规则的字典
slices_mapper = {f"a{i+1:03d}": (i*2, (i+1)*2) for i in range(249)} # 简化到249个,避免过长的输出
# 假设实际场景中,最后几列可能不是固定长度,例如:
slices_mapper["a250"] = (498, 500) # 模拟最后几列
slices_mapper["a251"] = (500, None) # 从500到字符串末尾
# 3. 定义解析函数,使用 pd.concat
def parse_long_string_optimized(df_input, mapper):
"""
高效解析长字符串列并创建多个新列,避免 DataFrame 碎片化。
Args:
df_input (pd.DataFrame): 包含 'long_string' 列的 DataFrame。
mapper (dict): 字典,键为新列名,值为元组 (start, end) 表示切片范围。
Returns:
pd.DataFrame: 包含原始列和所有新列的 DataFrame。
"""
# 使用字典推导式为每个新列生成一个 Series,然后通过 pd.concat 沿列方向合并
new_cols_df = pd.concat(
{
col_name: df_input["long_string"].str[start:end]
for col_name, (start, end) in mapper.items()
},
axis=1 # 沿列方向合并
)
# 将新生成的 DataFrame 与原始 DataFrame 进行连接
return df_input.join(new_cols_df)
# 4. 调用优化后的函数
result_optimized = parse_long_string_optimized(df, slices_mapper)
# 打印结果 DataFrame 的信息
print(result_optimized.head())
print(f"\nDataFrame 形状: {result_optimized.shape}")
print(f"DataFrame 列数: {len(result_optimized.columns)}")代码解释:
通过采纳 pd.concat 这种批量处理策略,您可以显著提升 Pandas 数据处理的效率和稳定性,尤其是在处理大规模数据集和复杂特征工程任务时。
# 处理器
# app
# 工具
# 数据访问
# 键值对
# pandas
# for
# 字符串
# 循环
# 数据结构
# 切片
# copy
# 对象
# 这是一个
# 数据处理
# 适用于
# 它会
# 键值
# 串列
# 是一个
# 是在
# 多个
# 亡羊补牢
相关文章:
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
高防服务器租用首荐平台,企业级优惠套餐快速部署
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
已有域名和空间如何快速搭建网站?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
一键网站制作软件,义乌购一件代发流程?
定制建站哪家更专业可靠?推荐榜单揭晓
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
建站主机与虚拟主机有何区别?如何选择最优方案?
建站之星代理如何优化在线客服效率?
太原网站制作公司有哪些,网约车营运证查询官网?
建站主机是否等同于虚拟主机?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
制作网站外包平台,自动化接单网站有哪些?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
如何用PHP快速搭建CMS系统?
建站org新手必看:2024最新搭建流程与模板选择技巧
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何在服务器上三步完成建站并提升流量?
如何设计高效校园网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
网站制作软件有哪些,制图软件有哪些?
建站之星代理商如何保障技术支持与售后服务?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
济南网站建设制作公司,室内设计网站一般都有哪些功能?
自助网站制作软件,个人如何自助建网站?
制作网站的基本流程,设计网站的软件是什么?
css网站制作参考文献有哪些,易聊怎么注册?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何零基础在云服务器搭建WordPress站点?
建站之星微信建站一键生成小程序+多端营销系统
头像制作网站在线制作软件,dw网页背景图像怎么设置?
建站之星安装路径如何正确选择及配置?
教学网站制作软件,学习*后期制作的网站有哪些?
建站之星24小时客服电话如何获取?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
已有域名能否直接搭建网站?
如何在Windows服务器上快速搭建网站?
如何选择高效稳定的ISP建站解决方案?
油猴 教程,油猴搜脚本为什么会网页无法显示?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
网站设计制作企业有哪些,抖音官网主页怎么设置?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何在服务器上配置二级域名建站?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
如何通过网站建站时间优化SEO与用户体验?
*请认真填写需求信息,我们会在24小时内与您取得联系。