Используйте concat
для объединения DataFrame вместе, а затем используйте DataFrame.pivot_table
с функцией агрегирования first
для возврата первых значений в три раза table,database,node
:
df = (pd.concat([df1, df2])
.pivot_table(index='table',
columns=['database','node'],
values='value',
aggfunc='first'))
print (df)
database database1
node node1 node2
table
table A A1 NaN
table B B1 B2
table C C1 C2
table D NaN D2
Если возможно дублирование по тройкам table,database,node
, то используйте агрегирование по join
во избежание потери данных:
df1 = pd.DataFrame(
{
"database": {
"0": "database1",
"1": "database1",
"2": "database1",
},
"table": {
"0": "table A",
"1": "table A",
"2": "table C",
},
"node": {
"0": "node1",
"1": "node1",
"2": "node1",
},
"value": {
"0": "A1",
"1": "B1",
"2": "C1",
}
})
print (df1)
database table node value
0 database1 table A node1 A1 <- duplicated triple
1 database1 table A node1 B1 <- duplicated triple
2 database1 table C node1 C1
df = (pd.concat([df1, df2])
.pivot_table(index='table',
columns=['database','node'],
values='value',
aggfunc=','.join))
print (df)
database database1
node node1 node2
table
table A A1,B1 NaN
table B NaN B2
table C C1 C2
table D NaN D2
Если использовать first
с дублированными тройками возвращается только первое значение:
df = (pd.concat([df1, df2])
.pivot_table(index='table',
columns=['database','node'],
values='value',
aggfunc='first'))
print (df)
database database1
node node1 node2
table
table A A1 NaN <- B1 is lost
table B NaN B2
table C C1 C2
table D NaN D2