【问题标题】:Loading tweet json file with multiple json objects into pandas dataframe将带有多个 json 对象的推文 json 文件加载到 pandas 数据框中
【发布时间】:2021-08-06 04:18:03
【问题描述】:

我有一个 JSON 文件 (tweetObject.json),其中包括大约 600 行,其中每行是来自 Twitter API 的响应,其中包含大约 100 条推文及其元数据。

我的问题:

  1. 如何从我的 JSON 文件中提取特定的推文属性,例如 username? (我正在考虑将 JSON 加载到 pandas 数据框中,其中每列仅存储一个属性/字段,然后选择我需要的特定属性。但我也愿意接受任何其他解决方案。
  2. 如何将 JSON 文件加载到 pandas 数据框中?我使用了json.load,但我得到了JSONDecodeError: Extra data: line 2 column 1 (char 173419)。经过一番研究,我发现这个错误的原因可能是因为json.load没有解码多个JSON对象。
  3. 我还有一个扁平化的 JSON 文件版本,每行保留 1 条推文。我也用这个文件尝试了json.load,但仍然得到同样的错误。

这是我加载 json 的代码:

with open('tweetObject_v2.json') as json_file:
    data_list = json.load(json_file)   

抱歉,我没有写推文对象 JSON 的示例,因为这个文件的一行太长了。但您可以在此处找到示例 Twitter API (v2) 响应:https://developer.twitter.com/en/docs/twitter-api/data-dictionary/example-payloads

【问题讨论】:

  • 在我的回答中添加了几个数据框提取示例

标签: python json pandas twitter nested


【解决方案1】:

好吧,我终于想通了。希望它可以帮助其他有类似问题的人

回答问题2:如何将一个带有多个json对象的json文件加载到pandas dataframe中?

由于json.loads 不解码多个 JSON 对象,我循环遍历行并逐行加载,并将结果存储在数组中。接下来,我将数组转换为 pandas 数据框:

tweets = []
for line in open('tweetsFlatten.json', 'r'):
     tweets.append(json.loads(line))

df1 = pd.DataFrame(tweets)

检查 df1 的列,我发现有些列包含数组或对象(即每个属性没有单独的列)。例如,author 列保存了作者对象,其中包括 id(用户 id)、用户名等。

回答问题 1:如何在推文 JSON 文件中提取/访问特定推文属性?

为了能够访问特定属性(例如,username),我使用了json_normalize

df_new = json_normalize(tweets)  
df_new.columns  
#df_new is a new df where each arrtibute has a separate column. 
#For example, instead of an `author` column which kept various attributes (id, username, etc.), the new dataframe has separate columns for each of them (e.g., `author.id`, `author.username`, etc.

df_new['author.username'].head() 

注意事项:

  • 我使用的是 Twitter API V2,因此响应 JSON 文件位于 version 2 format
  • 我使用了 json 文件的扁平化版本,因为我发现它更易于使用(例如,访问特定属性)

【讨论】:

    【解决方案2】:

    如果你可以读取扁平文件的每一行然后加载到json中,你可以这样做:

    data = example line above in your questions
    dataj = json.loads(data)
    dataj['author']['username']
    

    输出

    'Megresistor'
    

    如果您能够构建一个数据框,并且该数据框有用户列(应该是一个字典),您可以使用它来提取屏幕名称

    df.user.str.get('screen_name')
    

    这将获得用户提及的第一个屏幕名称。用户提及是一个列表,因此这是列表的第一个元素。当有一个列表时,获取所有内容会有点复杂,但至少您可以了解如何导航数据框。

    df.entities.str.get('user_mentions').str[0].str.get('screen_name')
    

    【讨论】:

    • 我不确定我是否理解你的答案。你的意思是逐行加载json文件中的数据吗?我刚刚在我的问题中发布了我更新的代码。
    • 是的,如果您能够到达每一行并循环通过,您可以将用户名解析成一个列表。目前尚不清楚您的数据是什么样的,因此很难给您更详细的答案。这不是让它进入熊猫的方法。因为 twitter 响应非常复杂,所以我为特定操作编写解析脚本。您可能想尝试 flatten_json 而不是 json_normalize。我已经将它与其他复杂的 json 结构一起使用。
    • 你能发布一个文本文件的链接吗?
    • 感谢乔纳森的更新。我真的想通了。我读取每一行并循环遍历行(我加载了每一行并将其放入一个数组中)。然后,我将数组转换为 pandas 数据帧,最后,我在结果数据帧上使用了json_normalize。当我检查列时,我发现有些列包含一个数组或对象。因此,我决定对 flatten_json 文件重复相同的步骤。幸运的是,这给了我一个数据框,每个属性都有一个单独的列(包括用户名:)
    猜你喜欢
    • 2019-12-28
    • 2021-08-16
    • 2022-01-19
    • 2021-01-21
    • 2020-07-21
    • 2021-12-20
    • 2016-06-08
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多