【问题标题】:Convert nested dictionary of lists into pandas dataframe efficiently有效地将列表的嵌套字典转换为 pandas 数据框
【发布时间】:2018-05-04 15:58:58
【问题描述】:

我有一个这样的 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)我们看不到您现有的代码,因此无法判断我们的解决方案是否会比您现在拥有的更快; (2)“尽可能快”尚不清楚 - 最快可能的解决方案可能涉及下降到 Cython 或其他一些非平凡的优化。这就是为什么我将您的问题重新命名为“有效地”。
  • 由于公司政策,我不能放代码。然而,我已经明确表示我知道如何找到解决方案,但需要一个高性能的解决方案。我不相信这里的效率这个词。因此,关于将所述 dict 对象转换为 pandas df 的最快方法是什么(如果有没有深入研究 Cython 的可用方法),这更像是一个普遍的问题
  • 虽然您无法发布代码,但您能否提供现有解决方案的概要......例如您正在使用哪个库,什么函数、生成器或列表理解等?我正在尝试帮助您改进您的问题,以便获得更多关注。不要个人认为。
  • 我不是在防守。我真的想让这个问题变得更好,以防其他人在同一条船上,考虑到我有多少这个问题的用例,我敢打赌很多人都遇到过它。我确实提到我使用 pd.Series 并申请。根据我在网上的研究,这些速度很慢,因为它们遍历数据帧的每一行。我查看了 ast 库,但无法让它为我的目的工作

标签: python pandas dictionary dataframe


【解决方案1】:

一种方法是使用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

【讨论】:

  • 谢谢。我会尝试这种方式,看看我是否会在性能方面得到任何好处
猜你喜欢
  • 2020-03-31
  • 2021-11-28
  • 2022-01-07
  • 1970-01-01
  • 2015-10-06
  • 2021-12-21
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多