通过扩展右侧数据框的单元格内容来省略左侧联接中的重复项

时间:2019-07-15 18:21:28

标签: python-3.x pandas

我想在python中加入两个数据框。左边的数据框有几列,右边的数据框只有三列。我想使用其中两个执行左连接,但我不想复制无法唯一标识的行,而是想向左数据帧的第三列添加一个附加值。 我认为以下示例将显示我在寻找什么:

左数据集如下:

 School  | Class | participation 
   ABC   |  1a   |  1  
   ABC   |  2a   |  0  
   CDE   |  1b   |  1  

正确的数据集如下:

 School  | Class | responsible 
   ABC   |  1a   |  Max    
   ABC   |  1a   |  James  
   ABC   |  2a   |  Julia  
   CDE   |  1b   |  Max    

您可以看到Max和James都在同一所学校和同一堂课中负责,因此输出应如下所示:

 School  | Class | participation | responsible 
   ABC   |  1a   |      1        |   Max&James    
   ABC   |  2a   |      0        |   Julia     
   CDE   |  1b   |      1        |   Max       

如果您有一个解决方案,该解决方案将首先复制未唯一标识的行,然后删除第二行/以所需的方式创建最后一列,那也很好。 / p>

一些帮助会很棒!谢谢!

2 个答案:

答案 0 :(得分:1)

In [235]: d1.merge(
     ...:     d2.groupby(["School", "Class"])
     ...:     ["responsible"]
     ...:     .apply(lambda x: x.str.cat(sep=" & "))
     ...:     .reset_index())
Out[235]:
  School Class  participation  responsible
0    ABC    1a              1  Max & James
1    ABC    2a              0        Julia
2    CDE    1b              1          Max

答案 1 :(得分:0)

这可行,请谨慎使用变量名:

df1.set_index([' School  ',' Class ']).reset_index().assign(responsible=df2.groupby([' School  ',' Class '])[' responsible '].apply(list).values)

输出:

   School     Class          participation               responsible
0     ABC       1a                         1  [  Max    ,   James  ]
1     ABC       2a                         0                 [  Max]
2     CDE       1b                         1             [  Julia  ]