首页 > 解决方案 > 将多个数据帧转换为特定格式很热?

问题描述

我有两个数据框:

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 不允许我提交问题,因为:“看起来您的帖子主要是代码;请添加更多详细信息。”。我添加此文本只是为了进一步传递。

标签: pythonpandaspandas-groupby

解决方案


用于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则使用聚合 byjoin以避免丢失数据:

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

推荐阅读