Горячий, чтобы преобразовать несколько фреймов данных в определенный формат? - PullRequest
1 голос
/ 04 ноября 2019

У меня есть два кадра данных:

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 ]

2 голосов
/ 04 ноября 2019

Используйте 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 голос
/ 04 ноября 2019

Вы можете объединить кадры данных и сводку:

(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...