Python遍历CSV数组异常:无法循环所有行的问题解决
修复CSV数据展开处理的Python代码问题
原始CSV数据
number,event_date,event_timestamp,event_name,event_params 0,20220315,1668314165054758,eventTracking1,"[{'key': 'test0', 'value': {'string_value': None1, 'int_value': 1662354225, 'float_value': None, 'double_value': None}} {'key': 'test2', 'value': {'string_value': 'http:\test1.com', 'int_value': None, 'float_value': None, 'double_value': None}} {'key': 'test3', 'value': {'string_value': 'A@gmail.com', 'int_value': None, 'float_value': None, 'double_value': None}}]" 1,20220325,1668445654758556,eventTracking2,"[{'key': 'test5', 'value': {'string_value': None3, 'int_value': 16658884225, 'float_value': None, 'double_value': None}} {'key': 'test7', 'value': {'string_value': 'http:\test2.com', 'int_value': None, 'float_value': None, 'double_value': None}} {'key': 'test8', 'value': {'string_value': 'A@gmail.com', 'int_value': None, 'float_value': None, 'double_value': None}}]" 2,20220335,1668317775054758,eventTracking3,"[{'key': 'test10', 'value': {'string_value': None5, 'int_value': 1662454225, 'float_value': None, 'double_value': None}} {'key': 'test12', 'value': {'string_value': 'http:\test3.com', 'int_value': None, 'float_value': None, 'double_value': None}} {'key': 'test13', 'value': {'string_value': 'A@gmail.com', 'int_value': None, 'float_value': None, 'double_value': None}}]"
期望输出格式
number,event_date,event_timestamp,event_name,event_params1,event_params2 0,20220315,1668314165054758,eventTracking1,test0,None1 0,20220315,1668314165054758,eventTracking1,test2,http:\test1.com 0,20220315,1668314165054758,eventTracking1,test3,A@gmail.com 1,20220325,1668445654758556,eventTracking2,test5,None3 1,20220325,1668445654758556,eventTracking2,test7,http:\test2.com 1,20220325,1668445654758556,eventTracking2,test8,A@gmail.com 2,20220335,1668317775054758,eventTracking3,test10,None5 2,20220335,1668317775054758,eventTracking3,test12,http:\test3.com 2,20220335,1668317775054758,eventTracking3,test13,A@gmail.com
(注:修正了期望输出中test6/None4的笔误,对应原始数据的test5/None3)
问题原因
你的代码仅处理了最后一行数据,核心问题:
for i in range(3):循环仅打印了索引值,后续所有处理代码都在循环体外,最终只会用循环结束后的i=2处理第3行数据- 每次处理结果没有被收集,而是直接覆盖为新的DataFrame,最终仅保留最后一行的展开结果
修复后的代码
import pandas as pd import re # 读取原始CSV文件 df = pd.read_csv("check.csv") # 定义单一行的处理函数 def process_single_row(row): # 获取event_params字段的字符串内容 params_str = row['event_params'] # 修复字典列表的格式:在}}后且紧跟{的位置添加逗号 fixed_str = re.sub(r'}}(\s*{)', r'}},\1', params_str) # 将字符串解析为字典列表 params_list = eval(fixed_str) # 生成当前行展开后的多行数据 expanded_rows = [] for param in params_list: expanded_rows.append({ 'number': row['number'], 'event_date': row['event_date'], 'event_timestamp': row['event_timestamp'], 'event_name': row['event_name'], 'event_params1': param['key'], 'event_params2': param['value']['string_value'] }) return pd.DataFrame(expanded_rows) # 遍历所有行,收集处理结果 result_dfs = [] for _, row in df.iterrows(): result_dfs.append(process_single_row(row)) # 合并所有结果并重置索引 df_final = pd.concat(result_dfs, ignore_index=True) # 调整列顺序为期望格式 df_final = df_final[['number', 'event_date', 'event_timestamp', 'event_name', 'event_params1', 'event_params2']] # 打印结果并保存为CSV print(df_final) df_final.to_csv("This_is_what_you_need.csv", index=False)
关键修复说明
- 行遍历逻辑:使用
iterrows()遍历原始DataFrame的每一行,确保所有行都被处理 - 格式修复优化:修改正则表达式,仅在字典间的分隔位置添加逗号,避免原代码导致的语法错误
- 结果收集合并:将每一行处理后的小DataFrame存入列表,最后用
concat()合并为最终结果 - CSV保存优化:添加
index=False参数,避免生成多余的索引列
内容的提问来源于stack exchange,提问作者Phh
相关产品推荐
相关产品推荐

