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

Pandas合并DataFrame报KeyError,关联列处理问题求助

问题与解决方案

需求说明

我有两个DataFrame(PG和Cap),需要将PG中的Today-Shift列与Cap中的Start Time EGS列关联合并,以获取Capped SCH Shift列,期望输出如下:

Today-Shift  Capped SCH Shift
0         0.375      09:00
1         0.375      09:00
2      0.291667      07:30
3      0.291667      07:30
4      0.291667      07:30

数据结构

DataFrame Cap

Start Time EGS Start Time UAE  Int no. Status End Time UAE  
0       07:00:00       09:00:00        1      N     18:00:00   
1       07:30:00       09:30:00        2      N     18:30:00   
2       08:00:00       10:00:00        3      N     19:00:00   
3       08:30:00       10:30:00        4      N     19:30:00   
4       09:00:00       11:00:00        5      N     20:00:00   

   Capped Next Day SCh  Capped SCH Shift  
0                  0.0               9.0  
1                  0.0               9.0  
2                  0.0               9.0  
3                  0.0               9.0  
4                  0.0               9.0  

DataFrame PG

Today-Shift
0         0.375
1         0.375
2      0.291667
3      0.291667
4      0.291667

错误代码与报错

运行以下代码:

PG = pd.merge(PG,Cap[['Today-Shift','Capped SCH Shift']],how='left' ,suffixes=('', '_remove'))
PG.drop([i for i in PG.columns if 'remove' in i],axis=1, inplace=True)

触发错误:

KeyError: "['Today-Shift'] not in index"

问题分析与解决

错误原因

  1. 列不存在:代码试图从Cap中提取Today-Shift列,但Cap根本没有这个字段,直接触发KeyError;
  2. 关联逻辑错误:PG的Today-Shift是一天时间的比例值(比如0.375=9/24),Cap的Start Time EGS是时间字符串,两者数据类型和值无法直接关联。

解决代码

import pandas as pd

# 1. 处理Cap的时间列,生成与PG匹配的比例键
# 将Start Time EGS转换为小时数(含分钟),再除以24得到比例
Cap['Shift_Ratio'] = pd.to_datetime(Cap['Start Time EGS']).dt.hour + pd.to_datetime(Cap['Start Time EGS']).dt.minute/60
Cap['Shift_Ratio'] = Cap['Shift_Ratio'] / 24

# 2. 合并两个DataFrame,用比例键关联
merged_df = pd.merge(PG, Cap[['Shift_Ratio', 'Start Time EGS']], 
                     left_on='Today-Shift', right_on='Shift_Ratio', how='left')

# 3. 格式化输出列,得到期望的时间格式
merged_df['Capped SCH Shift'] = pd.to_datetime(merged_df['Start Time EGS']).dt.strftime('%H:%M')

# 4. 保留需要的列
result = merged_df[['Today-Shift', 'Capped SCH Shift']]
print(result)

说明

  • 若你的Today-Shift与Start Time EGS的对应关系有调整(比如0.291667实际对应7.5小时即07:30),可微调比例计算逻辑;
  • 如果需要直接使用Cap中Capped SCH Shift的数值转换为时间,可替换步骤3为:merged_df['Capped SCH Shift'] = merged_df['Capped SCH Shift'].apply(lambda x: f"{int(x):02d}:00")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 02:33:29