I think you need pivot
with reindex
:
df1 = pd.DataFrame(index=[1,2,3], columns=list('abcd'))
print (df1)
a b c d
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
print (df2)
A B C
0 1 b 80
1 2 c 90
2 3 a 60
df = df2.pivot(index='A', columns='B', values='C') \
.reindex(index=df1.index, columns= df1.columns)
print (df)
a b c d
1 NaN 80.0 NaN NaN
2 NaN NaN 90.0 NaN
3 60.0 NaN NaN NaN
Alternative solution with unstack
:
df = df2.set_index(['A','B'])['C'].unstack() \
.reindex(index=df1.index, columns= df1.columns)
print (df)
a b c d
1 NaN 80.0 NaN NaN
2 NaN NaN 90.0 NaN
3 60.0 NaN NaN NaN
If duplicates in A
and B
use pivot_table
with some aggregate function like mean
:
print (df2)
A B C
0 1 b 80 <-duplicates for same A, B
1 1 b 100 <-duplicates for same A, B
2 2 c 90
3 3 a 60
df = df2.pivot_table(index='A', columns='B', values='C', aggfunc='mean') \
.reindex(index=df1.index, columns= df1.columns)
print (df)
a b c d
1 NaN 90.0 NaN NaN
2 NaN NaN 90.0 NaN
3 60.0 NaN NaN NaN
df = df2.groupby(['A','B'])['C'].mean().unstack() \
.reindex(index=df1.index, columns= df1.columns)
print (df)
a b c d
1 NaN 90.0 NaN NaN
2 NaN NaN 90.0 NaN
3 60.0 NaN NaN NaN