Python实现数据格式转换:将重复行数据转为多列存储
刚好做过类似的需求,给你两种Python实现方案,一种用Pandas库适合处理结构化数据,另一种纯原生代码不用依赖第三方库:
方法一:使用Pandas库(推荐处理结构化数据)
Pandas对表格类数据的分组、格式转换非常友好,代码逻辑清晰易读:
import pandas as pd # 定义原始数据 raw_data = { 'Events': ['Event1', 'Event2', 'Event3', 'Event4', 'Event1', 'Event1', 'Event5', 'Event3', 'Event4'], 'Days': [1, 2, 3, 3, 1, 2, 4, 4, 1] } # 转换成DataFrame格式 df = pd.DataFrame(raw_data) # 按Event分组,收集每个Event对应的所有Days grouped = df.groupby('Events')['Days'].apply(list).reset_index(name='Days_List') # 找到所有Event中Days列表的最大长度,用来统一补0 max_list_length = grouped['Days_List'].str.len().max() # 给每个Event的Days列表补0,直到长度等于最大长度 grouped['Days_List'] = grouped['Days_List'].apply(lambda x: x + [0]*(max_list_length - len(x))) # 转换为你需要的字符串格式并输出 result_lines = grouped.sort_values('Events').apply( lambda row: f"{row['Events']} {' '.join(map(str, row['Days_List']))}", axis=1 ) for line in result_lines: print(line)
方法二:纯Python字典实现(无第三方库依赖)
如果不想引入Pandas,用原生字典也能轻松实现:
# 原始数据(可以是列表元组格式) raw_data = [ ('Event1', 1), ('Event2', 2), ('Event3', 3), ('Event4', 3), ('Event1', 1), ('Event1', 2), ('Event5', 4), ('Event3', 4), ('Event4', 1) ] # 第一步:用字典收集每个Event对应的所有Days event_days_map = {} for event, day in raw_data: if event not in event_days_map: event_days_map[event] = [] event_days_map[event].append(day) # 第二步:确定需要补0的最大长度 max_length = max(len(days) for days in event_days_map.values()) # 第三步:补0并按Event排序输出结果 for event in sorted(event_days_map.keys()): days_list = event_days_map[event] # 补0到指定长度 padded_days = days_list + [0] * (max_length - len(days_list)) # 拼接成目标格式字符串 print(f"{event} {' '.join(map(str, padded_days))}")
两种方法运行后都会输出你需要的格式:
Event1 1 1 2 Event2 2 0 0 Event3 3 4 0 Event4 3 1 0 Event5 4 0 0
内容的提问来源于stack exchange,提问作者Cyley Simon
相关产品推荐
相关产品推荐

