是否热衷于将多个数据帧转换为特定格式?

时间:2019-11-04 14:40:58

标签: python pandas pandas-groupby

我有两个数据框:

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

如何将这两个数据帧转换为这种格式?

enter image description here

Stackoverflow不允许我提交以下问题:“看来您的帖子大部分是代码;请添加更多详细信息。”。 我添加此文本只是为了进一步。

2 个答案:

答案 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