首页 > 解决方案 > 无法弄清楚为什么在尝试将 JSON 值输入 DF 时出现错误

问题描述

一直在网上查找,但由于数据在 JSON 中可用,因此无法弄清楚为什么我会收到错误消息。

我正在尝试从 JSON 中提取“pull_request_contributors”值并放入 DF。

我得到错误:

KeyError: "Try running with errors='ignore' as key 'pull_request_contributors' is not always present"

代码

cg = CoinGeckoAPI()

ts = '01-01-2017'
cs = 'bitcoin'

# get data
result = cg.get_coin_history_by_id(cs, ts)

#pull_request_contributors
df_pr = pd_json.json_normalize(data, 
                            record_path='developer_data', 
                            meta=['pull_request_contributors']).set_index(ts)

JSON

{'community_data': {'facebook_likes': 40055,
  'reddit_accounts_active_48h': '4657.4',
  'reddit_average_comments_48h': 186.5,
  'reddit_average_posts_48h': 3.75,
  'reddit_subscribers': 1014816,
  'twitter_followers': 64099},
 'developer_data': {'closed_issues': 3845,
  'commit_count_4_weeks': 245,
  'forks': 22024,
  'pull_request_contributors': 564,
  'pull_requests_merged': 6163,
  'stars': 36987,
  'subscribers': 3521,
  'total_issues': 4478}...

期待

date        bitcoin 
01-01-2017  564

标签: pythonjsonpandas

解决方案


由于字段 pull_request_contributors 在每个对象中都不可用,因此 pandas 无法构建数据框。运行
df_pr = pd_json.json_normalize(data, record_path='developer_data', meta=['pull_request_contributors'], errors='ignore').set_index(ts) 以忽略缺失的字段。

编辑

json_normalized 创建一个表,其中所有字段都作为列,它们的值构成行。因此,对于您想要实现的目标,我不会使用 json_normalize,因为您知道要读取哪个特定字段。这就是我将如何做到的

ts = '01-01-2017'
cs = 'bitcoin'

df_pr = pd_json.json_normalize(data['developer_data'])

df = pd.DataFrame(data=[{'date': ts, 
                        cs: data['developer_data']['pull_request_contributors']}]).set_index('date')

这样我们就可以简单地构造 DataFrame,而无需首先对响应进行标准化。

如果响应是字符串而不是字典,我不知道 CoinGeckoAPI 返回什么,你可以先解码它

import json

data = json.loads(json_string)

希望这可以帮助


推荐阅读