使用Pandas遍历多CSV文件行并修改数据的合规实现问题
解决Pandas处理CSV时的列转换及行重复问题
问题场景
处理大量CSV文件时,需要根据指定条件转换Code列的数据。最初用iterrows()循环修改原DataFrame的行,但根据Pandas文档,这种方式不推荐,可能在处理大量文件时出现异常。尝试用新列表存储修改后的行副本,却出现行重复的问题。
最优解决方案:矢量化操作(推荐)
Pandas的核心优势是矢量化操作,比循环高效得多,完全避免iterrows()的潜在问题,处理50+CSV文件时速度更快。
方法1:使用replace函数
直接定义替换映射,一行代码完成转换:
import pandas as pd # 定义Code列的替换规则 code_mapping = { '14/9': '18', '14+9': '18', '149': '18', '3+4+1': '17' } # 对Code列执行替换 transformed_data['Code'] = transformed_data['Code'].replace(code_mapping)
方法2:使用loc条件赋值
如果需要更复杂的条件逻辑,用loc精准定位并修改:
# 匹配多个值,赋值为'18' transformed_data.loc[transformed_data['Code'].isin(['14/9', '14+9', '149']), 'Code'] = '18' # 匹配单个值,赋值为'17' transformed_data.loc[transformed_data['Code'] == '3+4+1', 'Code'] = '17'
循环方式的正确写法(不推荐,仅作参考)
如果一定要用循环,需注意仅初始化一次新列表,且每个行只处理并添加一次,避免重复:
new_rows = [] for index, row in transformed_data.iterrows(): # 复制原行,避免修改原DataFrame new_row = row.copy() # 执行条件转换 if new_row['Code'] in ['14/9', '14+9', '149']: new_row['Code'] = '18' elif new_row['Code'] == '3+4+1': new_row['Code'] = '17' # 每个处理后的行仅添加一次 new_rows.append(new_row) # 将列表转为新的DataFrame new_transformed_data = pd.DataFrame(new_rows)
之前出现行重复,大概率是因为循环内重复执行了append操作,或者没有正确复制行导致原数据被多次添加。
内容的提问来源于stack exchange,提问作者kylek748
相关产品推荐
相关产品推荐

