pandas 努力规范嵌套JSON数据

gr8qqesn  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一堆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个中的每一个在 Dataframe 中的不同行上)。如何消除每行中的[]并规范化 Dataframe 中的所有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


这就是我想要的结果,但是我得到了奇怪的错误,我想这是因为[] [] []等,我有几十个这样的错误,都在我的 Dataframe 中的单独的行中。
下面是一个小屏幕截图,显示了我的代码生成的CSV文件(我不知道如何用JSON表示它;我只是看到它在CSV文件中的样子)。
x1c 0d1x的数据

inb24sb2

inb24sb21#

json_normalize方法,

pd.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


pd.json_normalize

df1 = pd.DataFrame.from_dict(pd.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.json_normalize(d1)
df2 = pd.json_normalize(d2)
df3 = pd.json_normalize(d3)

测试DataFrame是否为空

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_dictjson_normalize的输出

pd.DataFrame.from_dict(d2) == pd.json_normalize(d2)True

相关问题