将JSON转换为Pandas DataFrame

时间:2016-05-01 17:38:57

标签: python json pandas dataframe

我遇到了一些麻烦。 我正在尝试将此JSON写入DataFrame。我觉得我的问题是我如何格式化JSON。当我写每条推文时。但是无法缩小范围。任何见解都会很棒。附件是我的raw_tweets.json和下面的第二个代码打击是我如何写它,用逗号分隔,即加入(',')

HERE是 LINK TO raw_tweets.json

 i get a raise JSONDecodeError("Extra data", s, end)

 JSONDecodeError: Extra data

#JSON to DataFrame

class tweet2dframe(object):

    def __init__(self, text="", location=""):
    self.text = text
    self.location = location

def getText(self):

    return self.text

def getLocation(self):

    return self.location



# import json package to load json file
 with open('raw_tweets.json',encoding="utf8") as jsonFile:
     polls_json = json.loads(jsonFile.read())




tweets_list = [polls(i["location"], i["text"]) for i in polls_json['text']]

colNames = ("Text", "location")
dict_list = []


for i in tweets_list:
    dict_list.append(dict(zip(colNames , [i.getText(), i.getLocation()])))


tweets_df = pd.DataFrame(dict_list)
tweets_df.head()

我将推文写入JSON的方式

saveFile = io.open('raw_tweets.json', 'w', encoding='utf-8')
saveFile.write(','.join(self.tweet_data))
saveFile.close()
exit()

1 个答案:

答案 0 :(得分:2)

raw_tweets.json包含无效的JSON。它包含以逗号分隔的JSON片段。要使整个文本成为有效JSON array,请括号[...] 围绕内容:

with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.loads('[{}]'.format(jsonFile.read()))

例如,

import pandas as pd
import json

with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.loads('[{}]'.format(jsonFile.read()))

tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]
colNames = ("location", "text")
tweets_df = pd.DataFrame(tweets_list, columns=colNames)
print(tweets_df.head())

产量

        location                                               text
0           None  RT @webseriestoday: Democracy Now: Noam Chomsk...
1  Pittsburgh PA  "The tuxedo was an invention of the Koch broth...
2           None  RT @webseriestoday: Democracy Now: Noam Chomsk...
3           None  RT @webseriestoday: Democracy Now: Noam Chomsk...

解决问题的另一种更好的方法是在raw_tweets.json中编写有效的JSON。毕竟,如果您想将文件发送给其他人,如果文件包含有效的JSON,您将使他们的生活更轻松。我们需要查看更多代码以确切地建议如何修复它,但通常您会希望使用json.dump将一个dicts列表作为JSON写入文件而不是“手动”编写JSON代码段与saveFile.write(','.join(self.tweet_data))

tweets = []
for i in loop:
    tweets.append(tweet_dict)
with io.open('raw_tweets.json', 'w', encoding='utf-8') as saveFile:
    json.dump(tweets, saveFile)

如果raw_tweets.json包含有效的JSON,那么您可以使用以下命令将其加载到Python的Python列表中:

with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.load(jsonFile)

将所需部分加载到DataFrame中的其余代码将保持不变。

如何构建这行代码

tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]

在交互式Python会话中,我在polls_json中检查了一个词典:

In [114]: import pandas as pd
In [115]: import json
In [116]: with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.loads('[{}]'.format(jsonFile.read()))
In [117]: dct = polls_json[1]
In [118]: dct
Out[118]: 
{'contributors': None,
 'coordinates': None,
 ...
  'text': "Like the old Soviet leaders, Bernie refused to wear a tux at last night's black-tie dinner.",
  'truncated': False,
  'user': {'contributors_enabled': False,
  ...
   'location': 'Washington DC',}}

它非常大,所以我在这里省略了部分内容以使结果更具可读性。 假设我正确猜到了您要查找的textlocation值, 我们可以看到,根据此词典dct,我们可以使用text访问所需的dct['text']值。但location'键位于嵌套字典dct['user']内。因此,我们需要使用dct['user']['location']来提取位置值。

顺便说一下,Pandas提供了一种方便的方法来将JSON读入DataFrame pd.read_json,但它依赖于JSON数据是“平坦的”。因为我们想要的数据是嵌套的dicts,所以我使用自定义代码,列表理解

tweets_list = [(dct['user']['location'], dct["text"]) for dct in polls_json]

提取值而不是pd.read_json