Python多行对比求助:编程新手处理未知行数CSV数据
嘿,作为编程新手处理这类CSV数据确实容易懵,我来帮你一步步搞定!先把你给出的示例数据整理下,方便我们看清楚结构:
Right \FR\Window open\Start 16.9 11.2 18.2
Right \FR\Window open\Start 16.5 11.7 17.5
Right \FR\Window open\Start 16.9 11.7 18
Right \FR\Window open\End 7.61 1.76 8.37
Right \FR\Window open\End 7.3 1.74 8.6
Right \FR\Window open\End 7.64 2.45 8.43
Right \FR\Window close\Start 13 8.2 14.4
Right \FR\Window close\Start 12.9 7.55 14.5
看得出来每行结构是:[位置] \[区域]\[操作]\[状态] 数值1 数值2 数值3,下面我用Python给你做具体的处理方案——毕竟它对新手友好,还有超多实用工具。
第一步:把原始数据转成结构化格式
首先我们要把每行拆分成清晰的字段,方便后续分析或统计:
# 如果你是从本地CSV文件读取,后面会说怎么改,先拿示例数据演示 sample_lines = [ "Right \\FR\\Window open\\Start 16.9 11.2 18.2", "Right \\FR\\Window open\\Start 16.5 11.7 17.5", "Right \\FR\\Window open\\Start 16.9 11.7 18", "Right \\FR\\Window open\\End 7.61 1.76 8.37", "Right \\FR\\Window open\\End 7.3 1.74 8.6", "Right \\FR\\Window open\\End 7.64 2.45 8.43", "Right \\FR\\Window close\\Start 13 8.2 14.4", "Right \\FR\\Window close\\Start 12.9 7.55 14.5" ] # 用来存处理后的结构化数据 structured_data = [] for line in sample_lines: line = line.strip() if not line: continue # 跳过空行 # 拆分:最后三个元素是数值,前面的是分类字符串 parts = line.split() category_str = ' '.join(parts[:-3]) num1, num2, num3 = map(float, parts[-3:]) # 把分类字符串拆成更细的字段 cat_parts = category_str.split('\\') position = cat_parts[0].strip() area = cat_parts[1].strip() operation = cat_parts[2].split()[1] # 从"Window open"里提取"open" state = cat_parts[3].strip() # 把一行数据转成字典,方便后续操作 structured_data.append({ '位置': position, '区域': area, '操作': operation, '状态': state, '数值1': num1, '数值2': num2, '数值3': num3 }) # 看看处理后的第一条数据长啥样 print(structured_data[0])
运行后你会得到这样的结构化结果:
{'位置': 'Right', '区域': 'FR', '操作': 'open', '状态': 'Start', '数值1': 16.9, '数值2': 11.2, '数值3': 18.2}
第二步:从本地CSV文件读取数据
如果你的数据存在本地文件(比如window_data.csv),只需要把上面的sample_lines替换成文件读取逻辑就行:
structured_data = [] with open('window_data.csv', 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue parts = line.split() category_str = ' '.join(parts[:-3]) num1, num2, num3 = map(float, parts[-3:]) cat_parts = category_str.split('\\') position = cat_parts[0].strip() area = cat_parts[1].strip() operation = cat_parts[2].split()[1] state = cat_parts[3].strip() structured_data.append({ '位置': position, '区域': area, '操作': operation, '状态': state, '数值1': num1, '数值2': num2, '数值3': num3 })
第三步:做常见的统计/筛选操作
如果想做比如「按操作和状态分组,计算数值平均值」这类需求,用Pandas库会超级简单:
import pandas as pd # 把结构化数据转成DataFrame(表格形式) df = pd.DataFrame(structured_data) # 按「操作」和「状态」分组,计算三个数值的平均值 grouped_avg = df.groupby(['操作', '状态'])[['数值1', '数值2', '数值3']].mean() print(grouped_avg)
运行后会得到这样的统计结果:
数值1 数值2 数值3 操作 状态 close Start 12.95 7.8750 14.4500 open End 7.516667 2.0500 8.466667 Start 16.766667 11.533333 17.900000
如果你还有具体需求(比如把处理后的数据写入新CSV、筛选特定状态的数据、做可视化),随时补充说明,我再帮你调整代码!
内容的提问来源于stack exchange,提问作者Alexe Adrian Marius

