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

基于日期将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:55:39