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

基于X条件合并DataFrame:如何将df1与df2合并得到指定结果?

问题:基于条件合并两个DataFrame得到目标结果

看起来你需要根据df1里的标记,把对应的日期从df2关联过来,生成包含Ticker、Type、Date的结果。我来帮你拆解一下怎么做:

首先先明确你的两个DataFrame结构:

df1结构:

Ticker Type Std_Week EOW
====== ==== ======== ===
12 OEX Index X NaN
13 XEO Index X NaN
14 SPX Index NaN X
15 XSP Index NaN X

df2结构:

Std_Week EOW
======== ===
0 2018-06-01 00:00:00 2018-06-01 00:00:00
1 NaN 2018-06-08 00:00:00
2 NaN 2018-06-22 00:00:00
3 NaN 2018-06-29 00:00:00
4 NaN 2018-07-06 00:00:00

解决方案:拆分处理+合并结果

核心思路是把df1里标记X的行分成两类(关联Std_Week日期的、关联EOW日期的),分别和df2中对应的日期列做交叉合并,最后把两部分结果整合到一起。

具体代码实现(基于Pandas)

import pandas as pd

# 1. 处理Std_Week标记为X的行:关联df2中所有非空的Std_Week日期
std_week_part = df1[df1['Std_Week'] == 'X'].merge(
    df2[['Std_Week']].dropna(),  # 只保留df2中非空的Std_Week日期
    how='cross'  # 每个符合条件的Ticker匹配所有对应日期
).rename(columns={'Std_Week': 'Date'})  # 重命名为目标列名

# 2. 处理EOW标记为X的行:关联df2中所有非空的EOW日期
eow_part = df1[df1['EOW'] == 'X'].merge(
    df2[['EOW']].dropna(),
    how='cross'
).rename(columns={'EOW': 'Date'})

# 3. 合并两部分结果,仅保留需要的三列
final_result = pd.concat([std_week_part, eow_part])[['Ticker', 'Type', 'Date']]

# 可选:处理日期格式,去掉时分秒(和示例结果对齐)
final_result['Date'] = pd.to_datetime(final_result['Date']).dt.strftime('%Y-%m-%d')

# 可选:按Ticker和Date排序,和示例顺序一致
final_result = final_result.sort_values(by=['Ticker', 'Date']).reset_index(drop=True)

print(final_result)

代码说明

  • 用df1[df1['Std_Week'] == 'X']精准筛选出需要关联Std_Week日期的行,同理处理EOW标记的行;
  • merge(how='cross')是关键:它能让每个标记的Ticker匹配对应日期列的所有非空值,正好满足你的需求;
  • 最后合并结果并调整格式,就能得到和你示例一致的输出:
Ticker   Type        Date
0    OEX  Index  2018-06-01
1    XEO  Index  2018-06-01
2    SPX  Index  2018-06-01
3    SPX  Index  2018-06-08
4    SPX  Index  2018-06-22
...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:40:09