【问题标题】:Duplicate Dataframe rows based on join key基于连接键的重复数据框行
【发布时间】:2020-08-18 14:57:08
【问题描述】:

假设我有两个 dfs - 教师和部门

teacher_id, name, dep_id
1, ABC, 10
2, XYZ, 20

dep_id
10
20
40
50

我想为缺少的部门复制教师行。所以输出需要是:

teacher_id, name, dep_id
1, ABC, 10
1, ABC, 20
1, ABC, 40
1, ABC, 50
2, XYZ, 20
2, XYZ, 10
2, XYZ, 40
2, XYZ, 50

Outer Join 和与 pandas 合并将为teacher_id 和 name 放置一个 NaN。我想复制这些值。任何想法如何做到这一点?

【问题讨论】:

  • @Ch3steR - 它不是真正的笛卡尔连接。如果我有额外的教师行(1,ABC,20),笛卡尔连接将给出 12 行作为 3 行教师 x 4 个部门。实际输出只有8行。
  • 现在明白了,感谢您的澄清。发布了一个答案,看看是否适合你;)

标签: python pandas join merge


【解决方案1】:

您可以使用 df.groupbyGroupby.apply 和自定义 func 过滤掉丢失的 dep_id 然后使用 pd.concat 将它们添加到相应的 teacher_id 并使用 df.ffill()

#df
#   teacher_id name  dep_id
#0           1  ABC      10
#1           2  XYZ      20

#df1
#   dep_id
#0      10
#1      20
#2      40
#3      50

def fill(df):
    m = df1['dep_id'].isin(df['dep_id'])
    missing = df1.loc[~m]
    return pd.concat([df, missing]).ffill()

df.groupby('teacher_id',group_keys=False).apply(fill)

   teacher_id name  dep_id
0         1.0  ABC      10
1         1.0  ABC      20
2         1.0  ABC      40
3         1.0  ABC      50
1         2.0  XYZ      20
0         2.0  XYZ      10
2         2.0  XYZ      40
3         2.0  XYZ      50

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2020-05-16
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多