将列表的嵌套字典有效地转换为pandas数据帧

时间:2018-05-04 15:58:59

标签: python pandas dictionary dataframe

我有一个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数据帧中,以便在_types对象下获得所有唯一的_id和_nm对

           _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 :(得分:2)

一种方法是重新构建字典并使用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