基于多DataFrame条件聚合为df1生成含重复值的新列问题
解决方法
首先要确保两个DataFrame的日期列都是datetime类型,否则日期比较逻辑会出错。之后可以通过以下方式实现需求:
基础实现(直观易懂)
通过apply遍历df1的每一行日期,筛选出df2中日期小于该行日期的type值,再转换成列表即可。
代码示例
- 构造示例数据并转换日期类型
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'])
- 生成目标列"b"
df1['b'] = df1['date'].apply(lambda x: df2[df2['date'] < x]['type'].tolist())
执行后df1的结果:
| date | b |
|---|---|
| 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
相关产品推荐
相关产品推荐

