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

如何对含重复ID的Pandas DataFrame透视合并实现单ID单行?

问题:按ID聚合,将日期对应的时间列展开为单行

原始DataFrame

ID     Day             StartTime  EndTime
819    Monday          12:30:00   19:00:00
819    Tuesday         12:30:00   19:00:00
819    Wednesday       12:30:00   19:00:00
819    Thursday        12:30:00   19:00:00
819    Friday          12:30:00   19:00:00
823    Monday          09:00:00   12:00:00
823    Tuesday         09:00:00   12:00:00
823    Wednesday       09:00:00   12:00:00
823    Thursday        09:00:00   12:00:00
823    Friday          09:00:00   12:00:00

可通过以下字典生成:

sample_dict = [
    {'ID': 819, 'Day': 'Monday', 'StartTime': '12:30:00', 'EndTime': '19:00:00'},
    {'ID': 819, 'Day': 'Tuesday', 'StartTime': '12:30:00', 'EndTime': '19:00:00'},
    {'ID': 819, 'Day': 'Wednesday', 'StartTime': '12:30:00', 'EndTime': '19:00:00'},
    {'ID': 819, 'Day': 'Thursday', 'StartTime': '12:30:00', 'EndTime': '19:00:00'},
    {'ID': 819, 'Day': 'Friday', 'StartTime': '12:30:00', 'EndTime': '15:30:00'},
    {'ID': 823, 'Day': 'Monday', 'StartTime': '09:00:00', 'EndTime': '12:00:00'},
    {'ID': 823, 'Day': 'Tuesday', 'StartTime': '09:00:00', 'EndTime': '12:00:00'},
    {'ID': 823, 'Day': 'Wednesday', 'StartTime': '09:00:00', 'EndTime': '12:00:00'},
    {'ID': 823, 'Day': 'Thursday', 'StartTime': '09:00:00', 'EndTime': '12:00:00'},
    {'ID': 823, 'Day': 'Friday', 'StartTime': '09:00:00', 'EndTime': '12:00:00'}
]
df = pd.DataFrame(sample_dict)

目标格式

ID  MondayStartTime MondayEndTime   TuesdayStartTime    TuesdayEndTime  WednesdayStartTime  WednesdayEndTime    ThursdayStartTime   ThursdayEndTime FridayStartTime FridayEndTime
819 12:30:00        19:00:00        12:30:00            19:00:00        12:30:00     19:00:00   12:30:00    19:00:00    12:30:00    19:00:00
823 09:00:00        12:00:00        09:00:00            12:00:00        09:00:00     12:00:00   09:00:00    12:00:00    09:00:00    12:00:00

错误原因

你之前的pivot参数完全不符合需求:

  • 原数据中不存在SiteID和DayID列,不能作为索引
  • 错误地将StartTime/EndTime设为列维度,这两个是需要保留的数值列,而非展开维度

解决方案

使用pivot方法正确设置聚合维度,再调整列名匹配目标格式:

# 执行pivot聚合:按ID分组,按Day展开时间列
pivoted_df = df.pivot(index='ID', columns='Day', values=['StartTime', 'EndTime'])

# 合并多级列名,生成类似"Monday_StartTime"的格式
pivoted_df.columns = [f'{day}_{col}' for col, day in pivoted_df.columns]

# 重置索引,让ID从索引变为普通列
pivoted_df = pivoted_df.reset_index()

# 按日期顺序调整列的排列(可选,保证列顺序和目标表一致)
day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
ordered_cols = ['ID'] + [f'{day}_{col}' for day in day_order for col in ['StartTime', 'EndTime']]
pivoted_df = pivoted_df[ordered_cols]

执行后即可得到与目标格式完全一致的DataFrame。


内容的提问来源于stack exchange,提问作者bellotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:50:45