将多个json对象转换为pandas数据帧

时间:2015-03-13 20:32:39

标签: python json pandas

我是python的新手,并且在概念上非常简单的事情上遇到了麻烦。我已经阅读了很多SO帖子,但仍无法解决我的问题。

我有一个将亚马逊评论转换为json格式的功能。每个评论都成为一个json对象。我想在一个数据帧中编译所有评论,json键作为列,每个评论连续。

有大量评论,每种评论都是这样的:

{
"product/productId": "B00006HAXW",
"product/title": "Winnie the Pooh",
"product/price": "unknown",
"review/userId": "A1RSDE90N6RSZF",
"review/profileName": "piglet",
"review/helpfulness": "9/9",
"review/score": "5.0",
"review/time": "1042502400",
"review/summary": "Love this book", 
"review/text" : "Exciting stories about highly intelligent creatures, very inspiring!"
}

如何将所有评论编译成pandas数据框?我有两个不同的问题:

  1. 如何在一个对象中编译所有评论?目前,输出生成如下:

    for e in parse("reviews.txt.gz"):
        print json.dumps(e)
    
  2. 我尝试创建一个空的list并使用append

        for e in parse("reviews.txt.gz"):
            revs = []
            revs = revs.append(json.dumps(e))
    

    但这不起作用 - print revs打印出来

    None
    None
    None 
    
    1. 当我在上面格式化的单个评论中使用pd.read_json时,它返回"如果使用所有标量值,则必须传递索引"。这是否意味着我没有有效的json格式数据?

1 个答案:

答案 0 :(得分:1)

  1. 无需在数据上调用json.dumps(),因为这会返回一个字符串,您可以将python对象传递给Pandas。
  2. 你的for循环应该看起来像

    revs = []
    for e in parse("reviews.txt.gz"):
        revs = revs.append(e)
    

    但是除非parse是一个生成器(即使用yield关键字),否则你可以设置revs = parse("reviews.txt.gz")

    1. pd.read_json尝试将json解析为DataFrame ...如果您只有一列,则会抛出错误,因为它希望数据被双重索引。
    2. 因此,如果revs现在是一个字符串列表(即你的解析函数返回数据的json表示),你可以调用

      df = pd.read_json(revs)
      

      否则,如果revs现在是一个字典列表(即你的解析函数已经解释了json并返回了数据的字典),你可以调用

      df = pd.DataFrame(revs)