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"
问题分析与解决
错误原因
- 列不存在:代码试图从Cap中提取
Today-Shift列,但Cap根本没有这个字段,直接触发KeyError; - 关联逻辑错误: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
相关产品推荐
相关产品推荐

