基于日期将DataFrame列值匹配至另一DataFrame的技术问询
解决DataFrame按日期匹配添加列且避免数据膨胀的问题
问题根源
你遇到的merge后数据膨胀,是因为两个DataFrame中存在重复的ObservationDate值,导致合并时产生笛卡尔积(比如events中同一日期对应多条记录,会和observation中同日期的每条记录一一匹配,成倍增加行数)。
高效解决方案
以下是几种Pythonic的方法,无需循环,且能避免重复:
方法1:构建日期-事件类型映射表后映射
先从events中提取唯一的日期与EventType对应关系,再用map快速匹配:
# 生成日期到EventType的唯一映射(若同一日期有多条记录,保留第一条) event_type_map = events.drop_duplicates(subset='ObservationDate').set_index('ObservationDate')['EventType'] # 给筛选后的filtered添加EventType列 filtered['EventType'] = filtered['ObservationDate'].map(event_type_map)
方法2:先去重再合并
先对events按日期去重,只保留需要的列,再和observation做内连接:
# 提取events中唯一日期对应的EventType unique_events = events.drop_duplicates(subset='ObservationDate')[['ObservationDate', 'EventType']] # 内连接只保留日期匹配的行 result = observation.merge(unique_events, on='ObservationDate', how='inner')
方法3:分组聚合(处理同一日期多事件的情况)
如果events中同一日期存在多个不同EventType,可以先聚合(比如取第一个、最后一个,或拼接),再合并:
# 按日期分组,取第一个EventType;若需要其他聚合逻辑可替换first() aggregated_events = events.groupby('ObservationDate')['EventType'].first().reset_index() # 合并得到结果 result = observation.merge(aggregated_events, on='ObservationDate', how='inner')
方法4:基于索引的join
将两个DataFrame的索引设为日期,用join方法快速匹配:
# 将events处理为索引是日期的EventType Series(去重) event_series = events.drop_duplicates(subset='ObservationDate').set_index('ObservationDate')['EventType'] # 重置索引恢复原结构 result = observation.set_index('ObservationDate').join(event_series, how='inner').reset_index()
以上方法都能高效处理百万级数据,避免循环带来的性能损耗。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

