Python如何将CSV中EVENT字段值转置为列并合并同时间数据
问题背景
输入文件内容
file.csv内容如下:
NE,PORT,EVENT,TIME,VALUE NODE,13,MAX,2021-08-30 09:15:00+01:00 DST,-10.9 NODE,13,MIN,2021-08-30 09:15:00+01:00 DST,-11.0 NODE,13,CUR,2021-08-30 09:15:00+01:00 DST,-10.9 NODE,13,MAX,2021-08-30 10:30:00+01:00 DST,-12.9 NODE,13,MIN,2021-08-30 10:30:00+01:00 DST,-10.0 NODE,13,CUR,2021-08-30 10:30:00+01:00 DST,-12.9
原处理代码
原有Python代码逻辑为将EVENT字段转为列匹配对应VALUE,再移除多余字段,代码如下:
intext=open('file.csv', 'r') check=intext.readlines() for lista in check: lista_split=lista.split(",") lista_split.extend(['MAX','MIN','CUR']) lista_index=[0,1,2,3,4] lista_index.extend([5,6,7]) contents=list(lista_split[i] for i in lista_index) if contents[2]==('MAX'): contents[5] = contents[4] elif contents[2]==('MIN'): contents[6] = contents[4] elif contents[2]==('CUR'): contents[7] = contents[4] contents.remove(contents[2]) contents.remove(contents[4]) print(contents)
当前输出问题
原代码为逐行处理逻辑,未做分组聚合,输出结果如下:
['NE', 'PORT', 'TIME', 'MAX', 'MIN', 'CUR'] ['NODE', '13', '2021-08-30 09:15:00+01:00 DST', '-10.9', 'MIN', 'CUR'] ['NODE', '13', '2021-08-30 09:15:00+01:00 DST', 'MAX', '-11.0', 'CUR'] ['NODE', '13', '2021-08-30 09:15:00+01:00 DST', 'MAX', 'MIN', '-10.9'] ['NODE', '13', '2021-08-30 10:30:00+01:00 DST', '-12.9', 'MIN', 'CUR'] ['NODE', '13', '2021-08-30 10:30:00+01:00 DST', 'MAX', '-10.0', 'CUR'] ['NODE', '13', '2021-08-30 10:30:00+01:00 DST', 'MAX', 'MIN', '-12.9']
预期输出
需要将同一NE、PORT、TIME的三行数据合并为一行,填充对应MAX、MIN、CUR数值:
['NE', 'PORT', 'TIME', 'MAX', 'MIN', 'CUR'] ['NODE', '13', '2021-08-30 09:15:00+01:00 DST', '-10.9', '-11.0', '-10.9'] ['NODE', '13', '2021-08-30 10:30:00+01:00 DST', '-12.9', '-10.0', '-12.9']
修改方案
原代码核心问题是没有增加分组聚合逻辑,逐行处理导致同组数据分散在三行中。我们可以用字典作为聚合容器,以(NE, PORT, TIME)为唯一分组键,把同组的MAX、MIN、CUR值归集到同一个条目下,修改后代码如下:
# 定义聚合容器,key为(NE, PORT, TIME),value为存储三个指标的字典 agg_data = {} with open('file.csv', 'r', encoding='utf-8') as f: lines = f.readlines() # 输出表头 print(['NE', 'PORT', 'TIME', 'MAX', 'MIN', 'CUR']) # 遍历处理所有数据行 for line in lines[1:]: line = line.strip() if not line: continue ne, port, event, time, value = line.split(',') group_key = (ne, port, time) # 分组不存在则初始化 if group_key not in agg_data: agg_data[group_key] = {'MAX': '', 'MIN': '', 'CUR': ''} # 填充对应指标的值 agg_data[group_key][event] = value # 遍历聚合结果输出 for key, val in agg_data.items(): res = list(key) + [val['MAX'], val['MIN'], val['CUR']] print(res)
运行上述代码即可得到预期输出结果。
内容的提问来源于stack exchange,提问作者stack6161
相关产品推荐
相关产品推荐

