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

基于多DataFrame条件聚合为df1生成含重复值的新列问题

解决方法

首先要确保两个DataFrame的日期列都是datetime类型,否则日期比较逻辑会出错。之后可以通过以下方式实现需求:

基础实现(直观易懂)

通过apply遍历df1的每一行日期,筛选出df2中日期小于该行日期的type值,再转换成列表即可。

代码示例

  1. 构造示例数据并转换日期类型
import pandas as pd

# 构造df1
df1 = pd.DataFrame({'date': ['2023-01-01']})
df1['date'] = pd.to_datetime(df1['date'])

# 构造df2
df2 = pd.DataFrame({
    'type': ['AAA', 'AAA', 'BBB'],
    'date': ['2022-01-01', '2022-01-02', '2023-02-02']
})
df2['date'] = pd.to_datetime(df2['date'])
  1. 生成目标列"b"
df1['b'] = df1['date'].apply(lambda x: df2[df2['date'] < x]['type'].tolist())

执行后df1的结果:

dateb
2023-01-01[AAA, AAA]

性能优化(针对大数据量)

如果df1和df2的数据量较大,apply逐行处理的效率会偏低。可以借助merge_asof的高效匹配能力,结合分组聚合实现:

# 先对df2按日期排序
df2_sorted = df2.sort_values('date').reset_index(drop=True)
# 给df1添加临时索引用于后续分组
df1_temp = df1.reset_index().rename(columns={'date': 'df1_date'})
# 匹配所有df2中日期小于df1_date的行
merged = pd.merge_asof(df1_temp, df2_sorted, left_on='df1_date', right_on='date', direction='backward')
# 分组聚合type为列表,映射回原df1
df1['b'] = merged.groupby('index')['type'].agg(list).values

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:31:08