基于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
相关产品推荐
相关产品推荐

