将Pandas数据框转换为嵌套的JSON(不使用列表嵌套)
将Pandas数据框转换为嵌套的JSON(不使用列表嵌套)
我知道这个主题有其他的线程,但是我遇到了一个其他答案似乎没有解决的问题。
给定以下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返回错误。(最顶部/底部的最外面的方括号是可以的。)如何使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'])
提前谢谢 🙂
问题的原因是作者想要将Pandas数据帧转换为嵌套的JSON格式,但是默认转换的结果是嵌套的列表形式,而不是嵌套的字典形式。作者想要得到的结果是每个数据行都包含一个嵌套的字典,其中键是列名,值是列值。
解决方法是使用了列表推导式和iterrows()方法来遍历数据帧的每一行。在遍历过程中,作者创建了一个字典,其中包含'a'和'b'列的值,并使用to_dict()方法将'c'和'd'列转换为字典形式。最后,将每个字典添加到一个列表中,得到了所需的嵌套JSON格式的结果。
下面是整理后的文章:
在处理数据时,有时我们需要将Pandas数据帧转换为嵌套的JSON格式。然而,默认情况下,Pandas转换的结果是嵌套的列表形式,而不是嵌套的字典形式。那么,如何实现将Pandas数据帧转换为嵌套的JSON格式呢?
一个解决方法是使用列表推导式和iterrows()方法来遍历数据帧的每一行。通过这种方式,我们可以将每个数据行转换为一个嵌套的字典,其中键是列名,值是列值。
下面是一个例子,展示了如何将Pandas数据帧转换为嵌套的JSON格式:
out = [{'a':x['a'],'b':x['b'],'nested_group':x[['c','d']].to_dict()} for _,x in df.iterrows()]
在这个例子中,我们假设数据帧df包含三列('a','b'和'c')的数据。通过使用iterrows()方法,我们可以遍历数据帧的每一行,并将每一行转换为一个嵌套的字典。
在每一行的转换过程中,我们首先将'a'和'b'列的值添加到字典中。然后,使用to_dict()方法将'c'和'd'列转换为字典形式,并将其添加为字典的一个键值对。最后,将每个字典添加到一个列表中。
最终的结果是一个嵌套的JSON格式,其中每个数据行都被转换为一个嵌套的字典。字典的键是列名,值是列值。
通过这种方法,我们可以方便地将Pandas数据帧转换为嵌套的JSON格式,以满足我们的需求。
感谢以上作者的分享和解决方案,特别是对于更易于推广的解决方法。同时,通过实际操作,我们也可以明显地看到这个解决方法的有效性。
希望本文对您理解如何将Pandas数据帧转换为嵌套的JSON格式有所帮助!
问题的原因是在使用Pandas的to_json方法将DataFrame转换为嵌套的JSON对象时,每个记录都被转换为一个包含一个元素的列表。因此,转换后的JSON对象中,每个记录都有一个额外的列表层级。
解决这个问题的方法是使用to_dict方法将DataFrame转换为字典,并使用orient参数设置为'records',以确保每个记录都是一个字典。然后,可以使用apply和lambda函数来选择所需的列并将其转换为字典。最后,使用reset_index方法重置索引并使用rename方法重命名列名,然后使用to_json方法将DataFrame转换为JSON字符串。
以下是解决问题的代码:
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']) result = (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')) print(result)
运行以上代码,将得到以下输出:
[{"a":"a1","b":"b1","nested_group":{"c":"c1","d":"d1"}},{"a":"a2","b":"b2","nested_group":{"c":"c2","d":"d2"}}]
通过使用to_dict方法和适当的参数设置,我们成功将Pandas DataFrame转换为嵌套的JSON对象,而不会出现额外的列表层级。