我有两个数据框:
df1 = pd.DataFrame(
{
"database": {
"0": "database1",
"1": "database1",
"2": "database1",
},
"table": {
"0": "table A",
"1": "table B",
"2": "table C",
},
"node": {
"0": "node1",
"1": "node1",
"2": "node1",
},
"value": {
"0": "A1",
"1": "B1",
"2": "C1",
}
})
df2 = pd.DataFrame(
{
"database": {
"0": "database1",
"1": "database1",
"2": "database1",
},
"table": {
"0": "table B",
"1": "table C",
"2": "table D",
},
"node": {
"0": "node2",
"1": "node2",
"2": "node2",
},
"value": {
"0": "B2",
"1": "C2",
"2": "D2",
}
})
df2
df1
database table node value
0 database1 table A node1 A1
1 database1 table B node1 B1
2 database1 table C node1 C1
df2
database table node value
0 database1 table B node2 B2
1 database1 table C node2 C2
2 database1 table D node2 D2
如何将这两个数据帧转换为这种格式?
Stackoverflow不允许我提交以下问题:“看来您的帖子大部分是代码;请添加更多详细信息。”。 我添加此文本只是为了进一步。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
您可以串联数据框并进行透视:
(pd.concat((df1,df2))
.pivot_table(columns='node',
index=['database','table'],
values='value',
aggfunc='first')
.unstack('database')
.swaplevel(0,1, axis=1)
)
输出:
database database1
node node1 node2
table
table A A1 NaN
table B B1 B2
table C C1 C2
table D NaN D2