簡體   English   中英

將 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 返回錯誤。 (對象頂部/底部的最外面的括號很好。)如何讓 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"}}]'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM