Външно свързване, добавящо липсващи стойности отдясно като нули или NaN

Опитвам се да обединя две PANDAS df по много специфичен начин.

DF1 =

Name    Color
Tom     Blue
Frank   Red
John    Green
Sarah   Red

DF2 =

Name    Shape   Value
Tom     Circle      4
Tom     Square      4
Frank   Triangle    7
John    Square      2
Sarah   Circle      1

Желан резултат = DFM =

Name    Color   Shape   Value
Tom     Blue    Circle      4
Frank   Red     Circle      0
John    Green   Circle      0
Sarah   Red     Circle      1
Tom     Blue    Square      4
Frank   Red     Square      0
John    Green   Square      2
Sarah   Red     Square      0
Tom     Blue    Triangle    0
Frank   Red     Triangle    7
John    Green   Triangle    0
Sarah   Red     Triangle    0

Външното присъединяване ми дава повечето от това, което искам, но не и нулите. Търся някаква представа за елегантен начин да направите това. Нулите или просто NaN са добре, тъй като мога просто да заменя NaN с нула.


person pacificdune    schedule 16.05.2018    source източник


Отговори (1)


Можете да използвате merge с unstack

s=df2.merge(df1,on='Name',how='outer')
s.set_index(['Name','Color','Shape']).Value.unstack(-1,fill_value=0).stack().reset_index().sort_values(['Shape','Name'])
Out[263]: 
     Name  Color     Shape  0
0   Frank    Red    Circle  0
3    John  Green    Circle  0
6   Sarah    Red    Circle  1
9     Tom   Blue    Circle  4
1   Frank    Red    Square  0
4    John  Green    Square  2
7   Sarah    Red    Square  0
10    Tom   Blue    Square  4
2   Frank    Red  Triangle  7
5    John  Green  Triangle  0
8   Sarah    Red  Triangle  0
11    Tom   Blue  Triangle  0
person BENY    schedule 17.05.2018