Внешнее соединение с добавлением пропущенных значений справа в виде нулей или 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