如何对含重复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
相关产品推荐
相关产品推荐

