【问题标题】:Transform JSON file to Data Frame in Python在 Python 中将 JSON 文件转换为数据框
【发布时间】:2021-08-26 08:45:10
【问题描述】:

我有一个具有 JSON 结构的文本文件,我想将其转换为数据框。

JSON 文件包括几个这样的 JSON 字符串:

{'cap': {'english': 0.1000, 'universal': 0.225}, 'display_scores': {'english': {'astroturf': 0.5, 'fake_follower': 0.8, 'financial': 0.2, '其他':1.8,'整体':1.8,'self_declared':0.0,'垃圾邮件发送者':0.2},'通用':{'astroturf':0.4,'fake_follower':0.2,'财务':0.2,'其他': 0.4, 'overall': 0.8, 'self_declared': 0.0, 'spammer': 0.0}}, 'raw_scores': {'english': {'astroturf': 0.1, 'fake_follower': 0.16, 'financial': 0.05,“其他”:0.35,“整体”:0.35,“self_declared”:0.0,“垃圾邮件发送者”:0.04},“通用”:{“astroturf”:0.07,“fake_follower”:0.03,“财务”:0.05, '其他':0.09,'整体':0.16,'self_declared':0.0,'垃圾邮件发送者':0.01}},'用户':{'majority_lang':'de','user_data':{'id_str':'123456 ', 'screen_name': 'beispiel01'}}}

tweets_data_path = "data.txt"
tweets_data = []
tweets_file = open(tweets_data_path, "r")
for line in tweets_file:
    try:
        tweet = json.loads(line)
        tweets_data.append(tweet)
    except:
        continue

tweets_data

df = pd.DataFrame.from_dict(pd.json_normalize(tweets_data), orient='columns')
df

但是,显然 json.loads 或 append 命令有问题,因为当我调用它时, tweets_data 是空的。

你有什么想法吗?

【问题讨论】:

  • 每一行都是文本文件中的有效 JSON 对象吗?您应该在except 子句中打印异常,而不是简单的continue 语句。您的代码在解码 JSON 时可能会抛出错误,并且您不会知道,因为您没有跟踪异常。
  • df = pd.read_json('data.txt') 应该很容易做到吗?

标签: python json python-3.x python-jsonschema python-jsons


【解决方案1】:

这就是您的代码应该如何将数据附加到tweets_data

import json
tweets_data_path = "data.txt"
tweets_data = []

with open(tweets_data_path, 'r') as f:
    for line in f.readlines():
        try:
            tweet = json.loads(json.dumps(line))
            tweets_data.append(tweet)
        except:
            continue
            

print(tweets_data)
["{'cap': {'english': 0.1000, 'universal': 0.225}, 'display_scores': {'english': {'astroturf': 0.5, 'fake_follower': 0.8, 'financial': 0.2, 'other': 1.8, 'overall': 1.8, 'self_declared': 0.0, 'spammer': 0.2}, 'universal': {'astroturf': 0.4, 'fake_follower': 0.2, 'financial': 0.2, 'other': 0.4, 'overall': 0.8, 'self_declared': 0.0, 'spammer': 0.0}}, 'raw_scores': {'english': {'astroturf': 0.1, 'fake_follower': 0.16, 'financial': 0.05, 'other': 0.35, 'overall': 0.35, 'self_declared': 0.0, 'spammer': 0.04}, 'universal': {'astroturf': 0.07, 'fake_follower': 0.03, 'financial': 0.05, 'other': 0.09, 'overall': 0.16, 'self_declared': 0.0, 'spammer': 0.01}}, 'user': {'majority_lang': 'de', 'user_data': {'id_str': '123456', 'screen_name': 'beispiel01'}}}\n", "{'cap': {'english': 0.1000, 'universal': 0.225}, 'display_scores': {'english': {'astroturf': 0.5, 'fake_follower': 0.8, 'financial': 0.2, 'other': 1.8, 'overall': 1.8, 'self_declared': 0.0, 'spammer': 0.2}, 'universal': {'astroturf': 0.4, 'fake_follower': 0.2, 'financial': 0.2, 'other': 0.4, 'overall': 0.8, 'self_declared': 0.0, 'spammer': 0.0}}, 'raw_scores': {'english': {'astroturf': 0.1, 'fake_follower': 0.16, 'financial': 0.05, 'other': 0.35, 'overall': 0.35, 'self_declared': 0.0, 'spammer': 0.04}, 'universal': {'astroturf': 0.07, 'fake_follower': 0.03, 'financial': 0.05, 'other': 0.09, 'overall': 0.16, 'self_declared': 0.0, 'spammer': 0.01}}, 'user': {'majority_lang': 'de', 'user_data': {'id_str': '123456', 'screen_name': 'beispiel01'}}}"]

【讨论】:

  • 它以这种方式工作,但我无法从中制作数据框,因为它显示 'str' 对象没有属性 'values'
  • 我对 pandas 不太熟悉,这就是为什么我没有提到任何关于 dataframe 的事情。
【解决方案2】:

无需将 JSON 加载到字典中,然后将该字典转换为 pandas 数据帧,只需使用 pandas 内置函数将 JSON 转换为 pandas 数据帧

df = pd.read_json(tweets_file)

或者,如果您希望将 JSON 加载到字典中,则将字典转换为数据框:

tweets_data = json.loads(tweets_file.read())
df = pd.DataFrame.from_dict(tweets_data, orient='columns')

【讨论】:

  • 不幸的是,这也不起作用。它说:“预期的对象或值”
  • 尝试直接传入路径df = pd.read_json("data.txt")
猜你喜欢
  • 2017-05-01
  • 2018-11-20
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2020-02-29
  • 1970-01-01
相关资源
最近更新 更多