Python 将JSON转换为数据帧

Python 将JSON转换为数据帧,python,json,pandas,dataframe,Python,Json,Pandas,Dataframe,我在这方面遇到了一些麻烦。 我正在尝试将此JSON写入DataFrame。我觉得我的问题是如何格式化JSON。当我写每条推文时。然而,我们无法缩小范围。任何洞察都会很棒。附件是我的raw_tweets.json,下面第二段代码是我如何编写的,用逗号分隔,即join(“,”) 这是最新的 #JSON到数据帧 class tweet2dframe(object): def __init__(self, text="", location=""): self.text = text

我在这方面遇到了一些麻烦。 我正在尝试将此JSON写入DataFrame。我觉得我的问题是如何格式化JSON。当我写每条推文时。然而,我们无法缩小范围。任何洞察都会很棒。附件是我的raw_tweets.json,下面第二段代码是我如何编写的,用逗号分隔,即join(“,”)

这是最新的

#JSON到数据帧

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()

raw_tweets.json
包含无效的json。它包含由逗号分隔的JSON片段。要使全文有效,请将括号置于括号中
[…]
围绕内容:

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\u tweets.JSON
中编写有效的JSON。毕竟,如果您想将该文件发送给其他人,那么如果该文件包含有效的JSON,您将使他们的生活更轻松。我们需要查看更多的代码,以明确建议如何修复它,但一般来说,您希望使用将DICT列表作为JSON写入文件,而不是使用
saveFile.write(','.join(self.tweet_data))“手动”写入JSON片段。

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

with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.load(jsonFile)
代码的其余部分将保持不变,以便将所需的部分加载到数据帧中


这行代码是如何构造的:

在一次交互式Python会话中,我检查了
polls\u json
中的一个dict:

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',}}
它相当大,所以我在这里省略了部分内容,以使结果更具可读性。 假设我正确猜测了您要查找的
文本
位置
值, 我们可以看到,给定这个dict,
dct
,我们可以使用
dct['text']
访问所需的
text
值。但是
location'
键在嵌套的dict中,
dct['user']
。因此,我们需要使用
dct['user']['location']
来提取位置值

顺便说一句,Pandas提供了一种将JSON读入数据帧的方便方法,
pd.read_JSON
,但它依赖于JSON数据是“平坦的”。因为我们需要的数据是嵌套的dict,所以我使用了自定义代码,列表

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

要提取值而不是pd.read_json
raw_tweets.json
包含无效的json。它包含由逗号分隔的JSON片段。要使全文有效,请将括号置于括号中
[…]
围绕内容:

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\u tweets.JSON
中编写有效的JSON。毕竟,如果您想将该文件发送给其他人,那么如果该文件包含有效的JSON,您将使他们的生活更轻松。我们需要查看更多的代码,以明确建议如何修复它,但一般来说,您希望使用将DICT列表作为JSON写入文件,而不是使用
saveFile.write(','.join(self.tweet_data))“手动”写入JSON片段。

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

with open('raw_tweets.json', encoding="utf8") as jsonFile:
    polls_json = json.load(jsonFile)
代码的其余部分将保持不变,以便将所需的部分加载到数据帧中


这行代码是如何构造的:

在一次交互式Python会话中,我检查了
polls\u json
中的一个dict:

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',}}
它相当大,所以我在这里省略了部分内容,以使结果更具可读性。 假设我正确猜测了您要查找的
文本
位置
值, 我们可以看到,给定这个dict,
dct
,我们可以使用
dct['text']
访问所需的
text
值。但是
location'
键在嵌套的dict中,
dct['user']
。因此,我们需要使用
dct['user']['location']
来提取位置值

顺便说一句,Pandas提供了一种将JSON读入数据帧的方便方法,
pd.read_JSON
,但它依赖于JSON数据是“平坦的”。因为我们需要的数据是嵌套的dict,所以我使用了自定义代码,列表

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

要提取值而不是pd.read_json

哇,这太棒了,请验证数据框中的文本和位置标签是否正确,我编辑了它们,但请验证您能否解释这一行?tweets_list=[(dct['user']['location'],dct[“text”])用于民调中的dct_json]我有点困惑,为什么“user”被包括在内,为什么引用中的位置和文本是我在StackOverflow上写过的最好的帖子,非常清楚,谢谢!hi@unutbu,我得到了一个错误:文件“C:/Users/DS/tweet_extraction.py”,第63行,tweets_list=[(dct['user']['location'],dct['text]])用于投票中的dct_json]类型错误:列表索引必须是整数或切片,不是str这个错误意味着
dct
是一个列表而不是一个dict。你是用
polls\u json=json.loads(“[{}]'.format(jsonFile.read())
定义了
raw\u tweets.json
还是用
json.dump(tweets,saveFile)
修复了
,请验证数据框中的文本和位置标签是否正确,我编辑了它们,但请验证。请您解释一下这一行?tweets_list=[(dct['user']['location'],dct[“text”])用于民调中的dct_json]我有点困惑,为什么“user”被包括在内,为什么引用中的位置和文本是我在StackOverflow上写过的最好的帖子,非常清楚,谢谢!hi@unutbu,我得到了一个错误:文件“C:/Users/DS/tweet_extraction.py”,第63行,tweets_list=[(dct['user']['location'],dct[“text”])用于轮询中的dct_json]类型错误:列表索引必须是整数或切片,而不是标准。错误意味着
dct
是一个列表而不是一个dict。您是否定义了
polls\u jso