无法弄清楚为什么将JSON值导入DF时出错

时间:2019-02-04 22:04:57

标签: python json pandas

开始在线查看,但由于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

1 个答案:

答案 0 :(得分:1)

由于字段pull_request_contributors在每个对象中均不可用,因此熊猫无法构建数据框。运行
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。

如果响应是字符串而不是dict,我不知道CoinGeckoAPI返回的内容,您可以先使用

对其进行解码
import json

data = json.loads(json_string)

希望这会有所帮助