大型航班数据集Pandas处理报错及需求实现问题
解决方案
首先确保两个DataFrame能通过**航班标识字段(比如acreg)**关联,且df_fpu按航班和时间排序,这是后续高效处理的基础。以下是适配大数据集的向量化解法:
步骤1:预处理df_fpu
先对df_fpu按航班标识和datetime排序,保证时间序列的连续性:
# 假设航班标识为acreg,可根据实际字段调整 df_fpu = df_fpu.sort_values(['acreg', 'datetime']).reset_index(drop=True)
步骤2:标记连续5行满足条件的起始位置
用滑动窗口(window=5)检查每个窗口内的fpu_A是否全部大于100,生成标记列valid_window:
import pandas as pd # 按航班分组,对每组计算滑动窗口的全满足结果 df_fpu['valid_window'] = df_fpu.groupby('acreg')['fpu_A'].rolling(window=5, min_periods=5).apply(lambda x: all(x > 100)).reset_index(drop=True)
min_periods=5确保只有完整的5行窗口才会被计算,避免边缘不完整窗口干扰结果。
步骤3:提取每个航班的首个有效datetime
对每个航班分组,筛选出第一个valid_window为True的行,提取其datetime作为该航班的目标起始时间:
# 提取每个航班的首个符合条件的时间 first_valid = df_fpu[df_fpu['valid_window']].groupby('acreg')['datetime'].first().reset_index(name='start')
步骤4:合并到df并处理NaN
用左连接将结果合并到df,即使某个航班没有符合条件的记录,start列会自动填充NaN,彻底避免KeyError:
df = df.merge(first_valid, on='acreg', how='left')
关于KeyError: '[nan] not in index'的说明
这个报错大概率是因为你之前的代码尝试用包含NaN的航班标识去匹配索引,或是分组时出现了NaN分组。上面的左连接方式会自动处理无匹配的情况,不会触发索引错误。
如果你的航班标识是多字段组合(比如stand+acreg),只需将分组和合并的字段替换为组合键即可,示例如下:
# 生成多字段组合键 df_fpu['flight_key'] = df_fpu['stand'] + '_' + df_fpu['acreg'] df['flight_key'] = df['stand'] + '_' + df['acreg'] # 后续操作替换为组合键 df_fpu = df_fpu.sort_values(['flight_key', 'datetime']).reset_index(drop=True) df_fpu['valid_window'] = df_fpu.groupby('flight_key')['fpu_A'].rolling(window=5, min_periods=5).apply(lambda x: all(x > 100)).reset_index(drop=True) first_valid = df_fpu[df_fpu['valid_window']].groupby('flight_key')['datetime'].first().reset_index(name='start') df = df.merge(first_valid, on='flight_key', how='left').drop('flight_key', axis=1)
内容的提问来源于stack exchange,提问作者Hans.nl
相关产品推荐
相关产品推荐

