Pandas如何基于双DataFrame条件,实现lact与lact-1的关联合并
匹配前一期泌乳期数据的Pandas合并实现
要实现df2的Lact关联df1的Lact-1的合并逻辑,有两种常用的实现方式:
方法1:构造临时匹配键合并
核心逻辑是给df1的泌乳期字段加1,让前一期的泌乳期数值刚好和df2的目标泌乳期数值匹配,再按常规规则合并即可,适合仅需要匹配前1期的场景:
# 提取df1所需字段,将原泌乳期重命名后构造匹配用的泌乳期字段 df1_match = df1[['NID', 'Lact', 'M-305', 'PI-M']].rename(columns={'Lact': 'original_lact'}) df1_match['Lact'] = df1_match['original_lact'] + 1 # 按NID和匹配用的泌乳期字段合并 df3 = pd.merge(df2, df1_match[['NID', 'Lact', 'M-305', 'PI-M']], on=['NID', 'Lact'], how='left')
运行后df2中Lact=7的行,会匹配到df1中original_lact=6对应的M-305=9360、PI-M=112的结果,符合需求。
方法2:分组偏移生成前一期字段
如果需要批量处理多期偏移匹配的场景,可以先对df1按NID分组后做数值偏移,直接生成对应前一期的指标字段再合并:
# 按NID分组后,将指标向下偏移1行,得到同NID下前一期的数值 df1['prev_M-305'] = df1.groupby('NID')['M-305'].shift(1) df1['prev_PI-M'] = df1.groupby('NID')['PI-M'].shift(1) # 直接与df2合并,此时Lact=7的行对应的prev字段就是Lact=6的数值 df3 = pd.merge(df2, df1[['NID', 'Lact', 'prev_M-305', 'prev_PI-M']], on=['NID', 'Lact'], how='left')
这种方法拓展性更强,如果需要匹配前2期、前3期数据,只需要调整shift()的参数即可。
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

