Преобразовать dict в трехколоночный фрейм данных, используя ID / ключ / значение - PullRequest
0 голосов
/ 03 мая 2018

Я уверен, что на это где-то был дан ответ, но запросить его немного сложно.

У меня есть dict, структурированный с полем ID, а затем 1-много пар ключ-значение например:

{ '123' : {'name': 'Joe', 'age': '17 },
  '888' : {'name': 'Cheryl', 'hometown': 'Liverpool'},
  '432' : {'name': 'Raj'}
 }

Я хочу получить это в таблицу SQL, структурированную в виде трех столбцов: id | свойство-имя | свойство-значение, например:

123 | name | Joe
123 | age  | 17
888 | name | Cheryl
888 | hometown | Liverpool
432 | name | Raj

Мой план состоял в том, чтобы пройти через DataFrame панды, а затем to_sql. Проблема состоит в том, что создание информационного кадра из-под диктовки делает заголовки столбцов идентификаторов и каждое возможное имя свойства строкой.

Вопрос 1. Является ли единственный способ преобразовать мой dict в трехкадровый фрейм данных, чтобы перебрать его, добавив значения в три массива?

Вопрос 2. Нужно ли вообще проходить через панд? Было бы лучше просто использовать sqlalchemy и заполнить вместо этого запрос INSERT?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Другой способ сделать это, используя from_dict

d = { '123' : {'name': 'Joe', 'age': '17'},
   '888' : {'name': 'Cheryl', 'hometown': 'Liverpool'},
   '432' : {'name': 'Raj'}
  }    
df = pd.DataFrame.from_dict(d, orient = 'index').unstack().reset_index()
df
        level_0 level_1          0
    0      name     123        Joe
    1      name     432        Raj
    2      name     888     Cheryl
    3       age     123         17
    4       age     432        NaN
    5       age     888        NaN
    6  hometown     123        NaN
    7  hometown     432        NaN
    8  hometown     888  Liverpool

Если вы хотите удалить NaN, просто добавьте .dropna() в конец оператора.

df = pd.DataFrame.from_dict(d, orient = 'index').unstack().reset_index().dropna()
df
        level_0 level_1          0
    0      name     123        Joe
    1      name     432        Raj
    2      name     888     Cheryl
    3       age     123         17
    8  hometown     888  Liverpool
0 голосов
/ 03 мая 2018

Вы можете использовать Series

pd.Series(d).apply(pd.Series).stack().reset_index()
Out[206]: 
  level_0   level_1          0
0     123       age         17
1     123      name        Joe
2     432      name        Raj
3     888  hometown  Liverpool
4     888      name     Cheryl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...