You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:49:27