如何按列条件复制Pandas DataFrame行,使Starting_hour递增至等于Ending_hour
解决方案:扩展DataFrame至每小时粒度(含跨天场景)
完整代码实现
import pandas as pd # 构造示例DataFrame(替换为你的实际数据) df = pd.DataFrame({ 'Weekday': [3, 3, 4], 'Day_in_Month': [1, 1, 2], 'Starting_hour': [1, 3, 22], 'Ending_hour': [3, 7, 2], 'Power': [35, 15, 5] }) # 定义生成小时序列的函数 def generate_hours(row): start = row['Starting_hour'] end = row['Ending_hour'] if start <= end: return list(range(start, end + 1)) else: # 跨天场景:先覆盖当天剩余小时,再覆盖次日目标小时 return list(range(start, 25)) + list(range(1, end + 1)) # 生成小时序列并扩展行 df['hour_sequence'] = df.apply(generate_hours, axis=1) expanded_df = df.explode('hour_sequence').rename(columns={'hour_sequence': 'Starting_hour'}) # 重置索引(可选,让结果更整洁) expanded_df = expanded_df.reset_index(drop=True) # 输出结果 print(expanded_df)
步骤说明
- 构造小时序列:通过
generate_hours函数处理每行的起始/结束小时:- 非跨天场景:直接生成从
Starting_hour到Ending_hour的连续整数列表 - 跨天场景:分两段生成列表,先从起始小时到24,再从1到结束小时
- 非跨天场景:直接生成从
- 扩展行数据:用
explode方法将每个小时序列拆分为独立行,同时将临时列重命名回原Starting_hour字段 - 整理结果:重置索引确保结果的索引连续有序
输出结果
运行代码后会得到你需要的扩展DataFrame,与示例完全匹配:
Weekday Day_in_Month Starting_hour Ending_hour Power 0 3 1 1 3 35 1 3 1 2 3 35 2 3 1 3 3 35 3 3 1 3 7 15 4 3 1 4 7 15 5 3 1 5 7 15 6 3 1 6 7 15 7 3 1 7 7 15 8 4 2 22 2 5 9 4 2 23 2 5 10 4 2 24 2 5 11 4 2 1 2 5 12 4 2 2 2 5
内容的提问来源于stack exchange,提问作者OAP
相关产品推荐
相关产品推荐

