Эффективно конвертируйте вложенный словарь списков в фрейм данных pandas - PullRequest
0 голосов
/ 04 мая 2018

У меня есть объект json, такой что

{
   "hits": {
      "hits": [
         {
            "_source": {
               "TYPES": [
                  {
                     "_ID": 130,
                     "_NM": "ARB-130"
                  },
                  {
                     "_ID": 131,
                     "_NM": "ARB-131"
                  },
                  {
                     "_ID": 132,
                     "_NM": "ARB-132"
                  }
               ]
            }
         },
         {
            "_source": {
               "TYPES": [
                  {
                     "_ID": 902,
                     "_NM": "ARB-902"
                  },
                  {
                     "_ID": 903,
                     "_NM": "ARB-903"
                  },
                  {
                     "_ID": 904,
                     "_NM": "ARB-904"
                  }
               ]
            }
         }
      ]
   }
}

Мне нужно распаковать его в фрейм данных pandas, чтобы я получил все уникальные пары _id и _nm в объекте _types

           _ID          _NM
0          130          ARB-130
1          131          ARB-131
2          132          ARB-132
3          902          ARB-902
4          903          ARB-903
5          904          ARB-904

Я ищу самое быстрое решение, так как число типов и количество пар внутри типов могут составлять сотни тысяч. Так что моя распаковка с использованием pd.Series и применения apply делает это медленным, и я хотел бы избежать этого, если это возможно. Любые идеи были бы хорошы. Также о разнесении словарей или списков в столбце в отдельные столбцы без использования pd.Series, поскольку я сталкиваюсь с этим вариантом использования на обычном

1 Ответ

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

Одним из способов является реструктуризация вашего словаря и выравнивание с использованием itertools.chain.

Для повышения производительности вы должны сравнить свои данные.

from itertools import chain

res = list(chain.from_iterable(i['_source']['TYPES'] for i in d['hits']['hits']))

df = pd.DataFrame(res)

print(df)

   _ID      _NM
0  130  ARB-130
1  131  ARB-131
2  132  ARB-132
3  902  ARB-902
4  903  ARB-903
5  904  ARB-904
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...