如何处理熊猫数据框中的嵌套列表和字典?

时间:2020-05-24 09:43:49

标签: python pandas

我正在使用包含不同数据点列表的JSON文件。每个条目具有以下结构,其中流派和评论的数量可以相差很大:

  {
    "title": "Golf Simulator",
    "genres": ["Sports", "Golf"],
    "score": 85,
    "critic_reviews": [
      { "review_critic": "XYZ", "review_score": 90 },
      { "review_critic": "ABC", "review_score": 90 },
      { "review_critic": "123", "review_score": 90 },
    ],
    "url": "http://example.com/golf-simulator"
  },

如果我只是将JSON文件转换为python列表并将其读入数据框,则结果如下所示:

enter image description here

如您所见,问题在于嵌套元素没有以非常有效的方式处理。现在,我不确定自己最好的处理数据的方法是什么,因为正如我提到的那样,类型和评论的数量确实有所不同。

也许有人使用过类似的东西,并且可以分享一些有关如何处理此问题的提示。

编辑:

正如我提到的,我不确定最佳实现是什么-我的猜测是,一个解决方案可能是像这样的嵌套列:

title            genres         critic_reviews
                 0       1      0                            
                                review_critic  review_score   
Golf Simulator   Sports  Golf   XYZ            90

2 个答案:

答案 0 :(得分:2)

不是Pandas解决方案,而是我仍然建议的解决方案:我将改用(内存中的)数据库以及相关表:

  • 游戏(标题,得分)
  • 类型(名称)
  • 评论家(姓名)
  • game_genre(fk.game,fk.genre)#允许每个游戏使用多种类型,每种游戏允许使用多种游戏
  • 评论(fk.game,fk.critic,得分)

(“ fk”指示符是外键,用于链接不同的表。)

将操作应用于表会比较麻烦(尽管使用适当的SQL不会太多),但是查询(例如,列出所有游戏的单个最高评价得分为65的游戏)可能要容易得多

答案 1 :(得分:0)

您可以尝试flatten_json

from flatten_json import flatten
import pandas as pd

data= [ {
    "title": "Golf Simulator",
    "genres": ["Sports", "Individual", "Golf","Arcade"],
    "score": 85,
    "critic_reviews": [
      { "review_critic": "XYZ", "review_score": 90 },
      { "review_critic": "ABC", "review_score": 90 },
      { "review_critic": "123", "review_score": 90 },
    ],
    "url": "http://example.com/golf-simulator"
  }]

dict_flattened = (flatten(record, '.') for record in data)
df = pd.DataFrame(dict_flattened)
df

输出应为:-

title           genres.0    genres.1    genres.2    genres.3    score critic_reviews.0.review_critic    critic_reviews.0.review_score   critic_reviews.1.review_critic  critic_reviews.1.review_score   critic_reviews.2.review_critic  critic_reviews.2.review_score   url
Golf Simulator  Sports      Individual  Golf        Arcade      85    XYZ                               90     ABC  90  123 90  http://example.com/golf-simulator