亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 Pandas DataFrame 創建嵌套 JSON,并將分組行作為最深嵌套內的屬性

從 Pandas DataFrame 創建嵌套 JSON,并將分組行作為最深嵌套內的屬性

嗶嗶one 2023-07-27 10:08:37
我正在尋找一種解決方案來構建嵌套的 dict / JSON,其中最后三列"name"、"color"、"amount"作為“product”列表中的屬性。cat1-cat3列中的值應該是鍵。提供的 DataFrame 如下所示:import pandas as pddf = pd.DataFrame({    'cat1': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'],    'cat2': ['BB', 'BB', 'BC', 'BB', 'BB', 'BB', 'BC', 'BC'],    'cat3': ['CC', 'CC', 'CD', 'CD', 'CD', 'CC', 'CD', 'CE'],    'name': ['P1', 'P2', 'P3', 'P1', 'P4', 'P1', 'P3','P6'],    'color': ['red', 'blue', 'green', 'green', 'yellow', 'red', 'blue', 'blue']    'amount': [132, 51, 12, 421, 55, 11, 123, 312]})這將是所需的輸出:{   "A":{      "BB":{         "CC":{            "products":[               {                  "name":"P1",                  "color":"red",                  "amount":132               },               {                  "name":"P2",                  "color":"blue",                  "amount":51               }            ]         }      },      "BC":{         "CD":{            "products":[               {                  "name":"P3",                  "color":"green",                  "amount":12               }            ]         }      }   },   "B":{      "BB":{         "CD":{            "products":[               {                  "name":"P1",                  "color":"green",                  "amount":421               },               {                  "name":"P4",                  "color":"yellow",                  "amount":55               }            ]         }      }   },   "C":{      "BB":{         "CC":{            "products":[               {                  "name":"P1",                  "color":"red",                  "amount":11               }            ]         }      },      "BC":{         "CD":{            "products":[               {                  "name":"P3",                  "color":"blue",                  "amount":123               }            ]         },@BEN_YO為這個問題提供了一個遞歸解決方案,沒有內積部分。
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

如果其他方法可以的話,你可以嘗試下面的方法,雖然有點臟(你可以嘗試優化它)


cols = ['name','color','amount']

u = df[df.columns.difference(cols)].join(df[cols].agg(dict,1).rename('d'))

v = (u.groupby(['cat1','cat2','cat3'])['d'].agg(list).reset_index("cat3"))


v = v.groupby(v.index).apply(lambda x: dict(zip(x['cat3'],x['d'])))

v.index = pd.MultiIndex.from_tuples(v.index,names=['cat1','cat2'])

d = v.unstack(0).to_dict()

print(d)

{'A': {'BB': {'CC': [{'amount': 132, 'color': 'red', 'name': 'P1'},

                     {'amount': 51, 'color': 'blue', 'name': 'P2'}]},

       'BC': {'CD': [{'amount': 12, 'color': 'green', 'name': 'P3'}]}},

 'B': {'BB': {'CD': [{'amount': 421, 'color': 'green', 'name': 'P1'},

                     {'amount': 55, 'color': 'yellow', 'name': 'P4'}]},

       'BC': nan},

 'C': {'BB': {'CC': [{'amount': 11, 'color': 'red', 'name': 'P1'}]},

       'BC': {'CD': [{'amount': 123, 'color': 'blue', 'name': 'P3'}],

              'CE': [{'amount': 312, 'color': 'blue', 'name': 'P6'}]}}}


查看完整回答
反對 回復 2023-07-27
?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

我們可以groupby基于分組類別cat1遞歸cat2地cat3構建字典:


def set_val(d, k, v):

    if len(k) == 1:

        d[k[0]] = v

    else:

        d[k[0]] = set_val(d.get(k[0], {}), k[1:], v)

    return d



dct = {}

for k, g in df.groupby(['cat1', 'cat2', 'cat3']):

    set_val(dct, k, {'products': g[['name', 'color', 'amount']].to_dict('r')})

print(dct)


{'A': {'BB': {'CC': {'products': [{'amount': 132, 'color': 'red', 'name': 'P1'},

                                  {'amount': 51, 'color': 'blue', 'name': 'P2'}]}},

       'BC': {'CD': {'products': [{'amount': 12, 'color': 'green', 'name': 'P3'}]}}},

 'B': {'BB': {'CD': {'products': [{'amount': 421, 'color': 'green', 'name': 'P1'},

                                  {'amount': 55, 'color': 'yellow', 'name': 'P4'}]}}},

 'C': {'BB': {'CC': {'products': [{'amount': 11, 'color': 'red', 'name': 'P1'}]}},

       'BC': {'CD': {'products': [{'amount': 123, 'color': 'blue', 'name': 'P3'}]},

              'CE': {'products': [{'amount': 312, 'color': 'blue', 'name': 'P6'}]}}}}


查看完整回答
反對 回復 2023-07-27
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

def gen_nested_dict(dataframe, group, inner_key, inner_dict):

? ? def set_val(d, k2, v):

? ? ? ? if len(k2) == 1:

? ? ? ? ? ? d[k2[0]] = v

? ? ? ? else:

? ? ? ? ? ? d[k2[0]] = set_val(d.get(k2[0], {}), k2[1:], v)

? ? ? ? return d


? ? dct = {}

? ? for k, g in dataframe.groupby(group):

? ? ? ? set_val(dct, k, {inner_key: g[inner_dict].to_dict('records')})


? ? return dct


?mydct = gen_nested_dict(df, ['cat1', 'cat2', 'cat3'], 'products', ['name', 'color', 'amount'])



查看完整回答
反對 回復 2023-07-27
  • 3 回答
  • 0 關注
  • 224 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號