我有一堆看起来像这样的JSON数据点:
[{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
[{'id': 36001, 'default': False, 'name': 'Add/Remove User', 'raw_name': 'Add/Remove User', 'value': 'req____add/remove_user'}, {'id': 36004, 'default': False, 'name': 'Add/Remove Subscription', 'raw_name': 'Add/Remove Subscription', 'value': 'req____add/remove_subscription'}, {'id': 36001, 'default': False, 'name': 'Other', 'raw_name': 'Other', 'value': 'other'}]
[{'id': 36002, 'default': False, 'name': '2', 'raw_name': '2', 'value': '2'}, {'id': 362, 'default': False, 'name': 'A', 'raw_name': 'A', 'value': 'a'}, {'id': 36001, 'default': False, 'name': 'B', 'raw_name': 'B', 'value': 'b'}, {'id': 36001, 'default': False, 'name': 'C', 'raw_name': 'C', 'value': 'c'}]
我想规范化数据,我尝试过:
df1 = pd.DataFrame.from_dict(json_normalize(df1), orient='columns')
这给出了以下错误:
'str' object has no attribute 'values'
根据我的研究,应该可以。我认为阻止它工作的原因是,我只有一排这样的行:[] [] [] []
(这4条中的每条都位于数据帧中的不同行上)。如何消除每行中的[]
并规范数据框中的所有JSON?
例如,如果我这样做:
df1 = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'}, {'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'}, {'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
df2 = pd.DataFrame.from_dict(json_normalize(df1), orient='columns')
print(df2)
我明白了:
default id name raw_name value
0 False 36001 Production Production production
1 False 3600 Development Development development
2 False 36001 Staging Staging staging
这就是我想要得到的结果,但是我遇到了奇怪的错误,并且我认为是由于[] [] []
等原因,我在数据框中有数十个这样的错误,它们都位于单独的行中。
这是我在CSV文件中看到的代码的小屏幕快照(我不知道如何用JSON表示它;我只是看到CSV文件中的样子)
答案 0 :(得分:0)
json_normalize
方法,
pandas.io.json.json_normalize(data, record_path=None, meta=None, meta_prefix=None, record_prefix=None, errors='raise', sep='.')
期望data
参数如下:
data : dict or list of dicts; Unserialized JSON objects
df1 = pd.DataFrame.from_dict(pd.io.json.json_normalize(df1), orient='columns')
基于代码示例,似乎应该将DataFrame
传递给json_normalize
到字典或字典列表中。如果您传递原始json,则如上所述,不会引发错误。
Quick Tutorial: Flatten Nested JSON in Pandas
如果我使用提供的数据:
d1 = [{'id': 36001, 'default': False, 'name': 'Production', 'raw_name': 'Production', 'value': 'production'},
{'id': 3600, 'default': False, 'name': 'Development', 'raw_name': 'Development', 'value': 'development'},
{'id': 36001, 'default': False, 'name': 'Staging', 'raw_name': 'Staging', 'value': 'staging'}]
d2 = [{'id': 36001, 'default': False, 'name': 'Add/Remove User', 'raw_name': 'Add/Remove User', 'value': 'req____add/remove_user'},
{'id': 36004, 'default': False, 'name': 'Add/Remove Subscription', 'raw_name': 'Add/Remove Subscription', 'value': 'req____add/remove_subscription'},
{'id': 36001, 'default': False, 'name': 'Other', 'raw_name': 'Other', 'value': 'other'}]
d3 = [{'id': 36002, 'default': False, 'name': '2', 'raw_name': '2', 'value': '2'},
{'id': 362, 'default': False, 'name': 'A', 'raw_name': 'A', 'value': 'a'},
{'id': 36001, 'default': False, 'name': 'B', 'raw_name': 'B', 'value': 'b'},
{'id': 36001, 'default': False, 'name': 'C', 'raw_name': 'C', 'value': 'c'}]
df1 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d1), orient='columns')
df2 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d2), orient='columns')
df3 = pd.DataFrame.from_dict(pd.io.json.json_normalize(d3), orient='columns')
测试数据框是否为空
df4 = pd.DataFrame.from_dict([])
df4.empty
True
合并它们-手动示例
df = pd.concat([df1, df2, df3])
组合它们-循环
list_of_dfs = [df1, df2, df3, df4]
df = pd.DataFrame()
for x in list_of_dfs:
if not x.empty:
df = df.append(x)
df.to_csv('test.csv')
在此示例中,from_dict
和json_normalize
的输出
pd.DataFrame.from_dict(d2) == pd.io.json.json_normalize(d2)
是True