pandas中使用file.write()时,itertuples的向量化替代方案可行吗?若可行是什么?
为什么遍历DataFrame行不是理想做法
- 性能劣势明显:pandas的核心依赖numpy的向量化计算,底层都是C语言实现的,执行效率极高。但用
itertuples这类Python层面的循环时,每一行数据都要经过Python解释器处理,小数据集可能看不出差异,一旦数据量达到几十万甚至几百万行,速度差距会拉到几十上百倍。 - 代码不够简洁优雅:pandas本身就是为批量数据处理设计的,能用一行向量化代码搞定的事,非要套循环绕圈,既啰嗦又不符合工具的设计逻辑,后续维护也麻烦。
针对示例的向量化替代方案
完全不用逐行循环,借助pandas的向量化字符串操作先生成所有输出内容,再一次性写入文件,效率和代码整洁度都能提升:
import pandas as pd data = pd.DataFrame({'columnNM': ['Jerry', 'Bob', 'Phil', 'Bill', 'Mickey', 'Pigpen', 'Robert'], 'columnNM2': ['John', 'Tom', 'Donna', 'Keith', 'Brent', 'Vince', 'Bruce']}) # 向量化生成所有待写入的行,自动匹配每行的对应字段 output_lines = data['columnNM'] + ' was friends with ' + data['columnNM2'] + '\n' # 用with语句打开文件更规范,写完会自动关闭文件,避免资源泄漏 with open('myPathExample', 'w') as file: file.writelines(output_lines)
带判断逻辑的场景怎么处理?
如果需要加入比较或控制流(比如只保留符合条件的行),也不用循环,先通过pandas的布尔索引过滤数据即可。比如只保留columnNM字段长度大于3的行:
# 先过滤出符合条件的数据 filtered_data = data[data['columnNM'].str.len() > 3] # 生成待写入内容 output_lines = filtered_data['columnNM'] + ' was friends with ' + filtered_data['columnNM2'] + '\n' # 写入文件 with open('myPathExample', 'w') as file: file.writelines(output_lines)
内容的提问来源于stack exchange,提问作者EthanT
相关产品推荐
相关产品推荐

