首页 > 解决方案 > 根据两个数据帧中的条件将列添加到另一个数据帧的数据帧

问题描述

以下数据是从两个较大的数据帧中提取的。df1

{'NID': {7: '212017463',
  8: '212017463',
  9: '212017463',
  10: '212017463',
  11: '212017463',
  12: '212017463',
  13: '212017463'},
 'Lact': {7: 1, 8: 2, 9: 3, 10: 4, 11: 5, 12: 6, 13: 7},
 'M-305': {7: 5018, 8: 5479, 9: 7134, 10: 9046, 11: 8972, 12: 9360, 13: 5295},
 'PI-M': {7: 94, 8: 83, 9: 96, 10: 116, 11: 117, 12: 112, 13: 0}}

自由度 2

{'NID': {1: '212017463', 2: '212017463', 3: '212017463'},
 'Lact': {1: 7, 2: 7, 3: 7}}

我想将之前哺乳期(Lact == 6)的 df1 系列 M-305 和 PI-M 与 df2(Lact =7)合并。

如果我做一个简单的合并


df3 = pd.merge(df2, df1[['NID', 'Lact', 'M-305', 'PI-M']], on=['NID', 'Lact'], how='left')
df3

我将 M-305 和 PI-M 合并用于哺乳期 (Lact) 7

    
    NID Lact M-305 PI-M
0 212017463 7 5295 0
1 212017463 7 5295 0
2 212017463 7 5295 0

我想得到的输出是 M-305 = 9360 和 PI-M = 110 (Lact 6) 值

有没有办法将 lact 与 lact-1 合并

谢谢

约翰

标签: pythonpandasdataframe

解决方案


如果您习惯了 SQL 及其JOIN操作的灵活性,那么不幸的是,Pandas 与这些不匹配。Pandas 仅提供等值连接(两个框架上的连接列必须匹配)和有限范围连接(形式为merge_asof)。

您可以手动计算连接列:

pd.merge(
    df2.assign(Lact_Merge = df2['Lact'] - 1),
    df1[['NID', 'Lact', 'M-305', 'PI-M']],
    left_on=['NID', 'Lact_Merge'],
    right_on=['NID', 'Lact'],
    how='left'
).drop(columns=['Lact_Merge', 'Lact_y']).rename(columns={'Lact_x': 'Lact'})

(我交替使用“join”和“merge”。我有一个后台 SQL Server,其中此类操作相当于INNER JOIN, LEFT JOIN, ...)


推荐阅读