将 Pandas 数据框转换为嵌套的 JSON(不作为列表嵌套)
Convert Pandas dataframe to nested JSON (without nesting as lists)
我知道 关于这个主题,但我 运行 遇到了一个似乎没有其他答案可以解决的问题。
给定以下 Pandas 数据框:
a b c d
a1 b1 c1 d1
a2 b2 c2 d2
我想创建一个具有以下结构的嵌套 JSON 对象:
[
{
"a": "a1",
"b": "b1",
"nested_group":
{
"c": "c1",
"d": "d1"
}
},
{
"a": "a2",
"b": "b2",
"nested_group":
{
"c": "c2",
"d": "d2"
}
}
]
我在其他线程中找到的解决方案是使用以下代码:
j = (df.groupby(['a','b'])
.apply(lambda x: x[['c','d']].to_dict('records'))
.reset_index()
.rename(columns={0:'nested_group'})
.to_json(orient='records'))
但是,我 运行 遇到的问题是上面的代码将每个 nested_group
对象放在方括号内,如下所示:
"nested_group": [
{
"c": "c2",
"d": "d2"
}
]
我试图生成的对象是 API 调用的有效负载,不幸的是,每个内部字典周围的方括号导致 API 到 return一个错误。 (对象最 top/bottom 处的最外面的括号很好。)如何使 Python 不将内部字典视为列表?
重现示例数据帧的代码:
import numpy as np
import pandas as pd
array = np.array([['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2']])
df = pd.DataFrame(data=array, columns=['a','b','c','d'])
提前谢谢你:)
让我们试试
out = [{'a':x['a'],'b':x['b'],'nested_group':x[['c','d']].to_dict()} for _,x in df.iterrows() ]
Out[284]:
[{'a': 'a1', 'b': 'b1', 'nested_group': {'c': 'c1', 'd': 'd1'}},
{'a': 'a2', 'b': 'b2', 'nested_group': {'c': 'c2', 'd': 'd2'}}]
查看 to_dict
的文档似乎我们仍然必须使用 records
选项,如果我们假设它将始终是 1
元素的列表,只是使用您的原始代码获取第 0
个元素
>>> import numpy as np
>>> import pandas as pd
>>> array = np.array([['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2']])
>>> df = pd.DataFrame(data=array, columns=['a','b','c','d'])
>>> (df.groupby(['a','b'])
.apply(lambda x: x[['c','d']].to_dict('records')[0])
.reset_index()
.rename(columns={0:'nested_group'})
.to_json(orient='records'))
'[{"a":"a1","b":"b1","nested_group":{"c":"c1","d":"d1"}},{"a":"a2","b":"b2","nested_group":{"c":"c2","d":"d2"}}]'
我知道
给定以下 Pandas 数据框:
a b c d
a1 b1 c1 d1
a2 b2 c2 d2
我想创建一个具有以下结构的嵌套 JSON 对象:
[
{
"a": "a1",
"b": "b1",
"nested_group":
{
"c": "c1",
"d": "d1"
}
},
{
"a": "a2",
"b": "b2",
"nested_group":
{
"c": "c2",
"d": "d2"
}
}
]
我在其他线程中找到的解决方案是使用以下代码:
j = (df.groupby(['a','b'])
.apply(lambda x: x[['c','d']].to_dict('records'))
.reset_index()
.rename(columns={0:'nested_group'})
.to_json(orient='records'))
但是,我 运行 遇到的问题是上面的代码将每个 nested_group
对象放在方括号内,如下所示:
"nested_group": [
{
"c": "c2",
"d": "d2"
}
]
我试图生成的对象是 API 调用的有效负载,不幸的是,每个内部字典周围的方括号导致 API 到 return一个错误。 (对象最 top/bottom 处的最外面的括号很好。)如何使 Python 不将内部字典视为列表?
重现示例数据帧的代码:
import numpy as np
import pandas as pd
array = np.array([['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2']])
df = pd.DataFrame(data=array, columns=['a','b','c','d'])
提前谢谢你:)
让我们试试
out = [{'a':x['a'],'b':x['b'],'nested_group':x[['c','d']].to_dict()} for _,x in df.iterrows() ]
Out[284]:
[{'a': 'a1', 'b': 'b1', 'nested_group': {'c': 'c1', 'd': 'd1'}},
{'a': 'a2', 'b': 'b2', 'nested_group': {'c': 'c2', 'd': 'd2'}}]
查看 to_dict
的文档似乎我们仍然必须使用 records
选项,如果我们假设它将始终是 1
元素的列表,只是使用您的原始代码获取第 0
个元素
>>> import numpy as np
>>> import pandas as pd
>>> array = np.array([['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2']])
>>> df = pd.DataFrame(data=array, columns=['a','b','c','d'])
>>> (df.groupby(['a','b'])
.apply(lambda x: x[['c','d']].to_dict('records')[0])
.reset_index()
.rename(columns={0:'nested_group'})
.to_json(orient='records'))
'[{"a":"a1","b":"b1","nested_group":{"c":"c1","d":"d1"}},{"a":"a2","b":"b2","nested_group":{"c":"c2","d":"d2"}}]'