将Pandas数据框转换为嵌套的JSON(不使用列表嵌套)

23 浏览
0 Comments

将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'])

提前谢谢 🙂

0
0 Comments

问题的原因是作者想要将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格式有所帮助!

0
0 Comments

问题的原因是在使用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对象,而不会出现额外的列表层级。

0