Pandas数据框创建与删除列的高效操作方法咨询
问题解答
问题1:覆盖原有列 vs 创建新列的效率对比
- 结论:直接覆盖原有列的效率更高,两者的计算耗时几乎没有差异,核心差异在内存占用环节:
- 创建新列时,Pandas需要为新列分配一块独立的内存空间存储计算结果,计算完成前原列的内存不会释放,数据规模越大,额外占用的内存越高,极端情况会触发内存溢出。
- 覆盖原有列时,计算得到的结果可以直接写入原列对应的内存块,不需要额外申请同量级的新内存,内存占用更低,整体效率更高。
- 你的场景中用完原列就会删除,不需要保留原列原始值,选择覆盖列的方案更优。
问题2:批量删除 vs 逐次删除的选择,以及链式写法实现
两种删除方式的效率对比
- 优先选批量统一删除:
df.drop()是基于列索引的批量操作,单次删除多列只需要做一次索引过滤和内存释放,比多次调用drop逐次删除的性能高2~10倍(和删除的列数正相关),数据规模越大优势越明显。 - 逐次删除的问题:每调用一次
drop都会触发一次DataFrame的索引重构和内存拷贝,多次操作会产生大量冗余的中间计算,反而拖慢效率。
链式写法报错原因
你写的df['E08'] = df['E8'] + df['E132'].multiply(0.1467).drop(...) 是把drop调用绑定在了df['E132'].multiply()返回的Series对象上,自然找不到E8和E132这两个列,会直接报错。
更简洁高效的实现方式
你可以直接用df.assign() 一次性生成所有新列,再通过索引过滤直接保留需要的列,完全不需要显式调用drop,代码更简洁性能也更好:
df = df.assign( E08 = lambda x: x['E8'] + x['E132'] * 0.1467, E037 = lambda x: x['E37'] - x['E65'], E032 = lambda x: x['E32'] - x['E40'], E010 = lambda x: x['E10'] + x['E45'] + (x['E28'] - x['E48']), E011 = lambda x: x['E11'] - x['E44'] - x['E43'], E021 = lambda x: x['E21'] - x['E50'] - x['E51'] - x['E52'] - x['E53'] - x['E54'], E031 = lambda x: x['E31'] - x['E41'] # 此处直接填写需要保留的所有列名即可 )[['datetime', 'E12', 'E47', 'E28', 'E46', 'E08', 'E037', 'E032', 'E010', 'E011', 'E021', 'E031']]
如果不想手动写保留列,也可以自动过滤不需要的列:
drop_cols = ['E8', 'E132', 'E37', 'E65', 'E32', 'E40', 'E10', 'E45', 'E48', 'E11', 'E44', 'E43', 'E21', 'E50', 'E51', 'E52', 'E53', 'E54', 'E31', 'E41'] df = df.assign( # 上述assign逻辑不变 ).drop(drop_cols, axis=1)
内容的提问来源于stack exchange,提问作者user_v27
相关产品推荐
相关产品推荐

