Pandas:一对多连接具有不同索引的数据帧

时间:2021-02-03 19:13:36

标签: python pandas

我有一个数据框和一个带有管理员/操作名称的参考表,我想加入“MNGR”,我认为这是一对多的关系。我不需要 DF2 中的任何其他列,但显然需要引用“MNGR”作为我的连接索引。

编辑:请注意,我已经完成了 Merging 101 并且无法找到适用于此处的答案。

DF1 = EMPLID  MNGR        YEAR     V1     V2     V3     V4
      12      BOB         2012     x      y      z      a
      13      JIM         2013     x      y      z      a
      14      RHONDA      2012     x      y      z      a
      15      RHONDA      2012     x      y      z      a
      16      JIM         2012     x      y      z      a
      17      RHONDA      2012     x      y      z      a

DF2 = MNGR      ADMIN/OP        YEAR       TRACT
      BOB       ADMINISTRATIVE  2000       A
      JIM       OPERATIONS      2013       B
      RHONDA    ADMINISTRATIVE  2012       A

我多年前通过一对多连接在 SQL 中执行过此操作,但我似乎无法理解此功能如何转换为 Python:

DF1.join(DF2.set_index('MNGR'), on='MNGR')

这通过了,但让我加入了 DF2,并且 ADMIN/OP 全部为空。

我的预期结果:

DF1 = EMPLID  MNGR        YEAR     V1     V2     V3     V4    ADMIN/OP
      12      BOB         2012     x      y      z      a     ADMINISTRATIVE
      13      JIM         2013     x      y      z      a     OPERATIONS
      14      RHONDA      2012     x      y      z      a     ADMINISTRATIVE
      15      RHONDA      2012     x      y      z      a     ADMINISTRATIVE
      16      JIM         2012     x      y      z      a     OPERATIONS
      17      RHONDA      2012     x      y      z      a     ADMINISTRATIVE

1 个答案:

答案 0 :(得分:1)

import pandas as pd

# sample dataframes
DF1 = pd.DataFrame({'EMPLID': [12, 13, 14, 15, 16, 17], 'MNGR': ['BOB', 'JIM', 'RHONDA', 'RHONDA', 'JIM', 'RHONDA'], 'YEAR': [2012, 2013, 2012, 2012, 2012, 2012], 'V1': ['x', 'x', 'x', 'x', 'x', 'x'], 'V2': ['y', 'y', 'y', 'y', 'y', 'y'], 'V3': ['z', 'z', 'z', 'z', 'z', 'z'], 'V4': ['a', 'a', 'a', 'a', 'a', 'a']})
DF2 = pd.DataFrame({'MNGR': ['BOB', 'JIM', 'RHONDA'], 'ADMIN/OP': ['ADMINISTRATIVE', 'OPERATIONS', 'ADMINISTRATIVE'], 'YEAR': [2000, 2013, 2012], 'TRACT': ['A', 'B', 'A']})

# verify there is not whitespace in the column names
DF1.columns = DF1.columns.str.strip()
DF2.columns = DF2.columns.str.strip()

# merge the dataframes
df = DF1.merge(DF2[["MNGR","ADMIN/OP"]], on='MNGR', how='left')

# display(df)
 EMPLID   MNGR  YEAR V1 V2 V3 V4       ADMIN/OP
     12    BOB  2012  x  y  z  a ADMINISTRATIVE
     13    JIM  2013  x  y  z  a     OPERATIONS
     14 RHONDA  2012  x  y  z  a ADMINISTRATIVE
     15 RHONDA  2012  x  y  z  a ADMINISTRATIVE
     16    JIM  2012  x  y  z  a     OPERATIONS
     17 RHONDA  2012  x  y  z  a ADMINISTRATIVE
相关问题