如何将DataFrame转换为嵌套字典,子元素和父元素中都有相同的列

2024-10-03 00:23:04 发布

您现在位置:Python中文网/ 问答频道 /正文

I have the dataframe as follows.

dictdata={'id':[991,992,989,5,4],'parentid':[4,4,4,0,0],'pcid': ['4_2','4_3','4_1','5','4']}
df = pd.DataFrame(dictdata)


   id   parentid  pcid
0  991         4  4_2
1  992         4  4_3
2  989         4  4_1
3    5         0    5
4    4         0    4

id是父列,parentid表示id(行)中的

I want to generate the dictionary from above dataframe as follows:

{'data': [{'id': '5', 'level': 0, 'parentid': 0, 'pcid': '5', 'children': []},
          {'id': '4',
           'level': 0,
           'parentid': 0,
           'pcid': '4',
           'children': [{'id': '991',
                         'level': 2, 
                         'parentid': 4, 
                         'pcid': '4_2'
                        },
                        {'id': '992',
                         'level': 3,
                         'parentid': 4,
                         'pcid': '4_3'
                        },
                       {'id': '989', 
                        'level': 1, 
                        'parentid': 4,
                        'pcid': '4_1'
                       }
          ]}
        ]}

Tags: theiddataframedfhaveaslevelpd
3条回答

试试这个也许对你有帮助

cols = df.columns
d = dict((df.groupby('id')[cols].apply(lambda x: x.to_dict('r'))))
>>d
{4: [{'id': 4, 'parentid': 0, 'pcid': 4}],
 5: [{'id': 5, 'parentid': 0, 'pcid': 5}],
 989: [{'id': 989, 'parentid': 4, 'pcid': '4_1'}],
 991: [{'id': 991, 'parentid': 4, 'pcid': '4_2'}],
 992: [{'id': 992, 'parentid': 4, 'pcid': '4_3'}]}

Create parent and child dataframe from actual dataframe

dfchild = df.loc[~(df['id']==df['pcid'])]
dfparent = df.loc[(df['id']==df['pcid'])] 

convert these df into dict:

parentdict = dfparent.to_dict('records')
childdict = dfchild.to_dict('records')

iterate the parentdict and inside get the respective child element from childdict based on parentid:

for parentdic in parentdict:
    eleid= int(parentdic['id'])
    childdictva=[]
    for child in childdict:
        childele=int(float(child['parentid']))
        if childele==eleid:
            childdictva.append(child)
    parentdic['children']=childdictva

Final code:

df['id']=df['id'].apply(str)
dfchild = df.loc[~(df['id']==df['pcid'])]
dfparent = df.loc[(df['id']==df['pcid'])]   
data = {}
parentdict = dfparent.to_dict('records')
childdict = dfchild.to_dict('records')
for parentdic in parentdict:
    eleid= int(parentdic['id'])
    childdictva=[]
    for child in childdict:
        childele=int(float(child['parentid']))
        if childele==eleid:
            childdictva.append(child)
    parentdic['children']=childdictva
data["data"] = parentdict

parentdict
{'data': [{'id': '5', 'level': 0, 'parentid': 0, 'pcid': '5', 'children': []},
 {'id': '4',
 'level': 0,
 'parentid': 0,
 'pcid': '4',
 'children': [{'id': '991', 'level': 2, 'parentid': 4, 'pcid': '4_2'},
  {'id': '992', 'level': 3, 'parentid': 4, 'pcid': '4_3'},
  {'id': '989', 'level': 1, 'parentid': 4, 'pcid': '4_1'}]}]}
from collections import defaultdict

d = defaultdict(dict)
for _, (i, parentid, pcid) in df.iterrows():
    d[i]['parentid'] = parentid
    d[i]['pcid'] = pcid

    level = 0
    if '_' in pcid:
        _, level = pcid.split('_')
    d[i]['level'] = level

result = {}
for k, v in d.items():
    if v['parentid'] not in d:
        result[k] = {'id': k, **v, 'children':[]}

for k, v in d.items():
    if v['parentid'] in d:
        result[v['parentid']]['children'].append({'id': k, **v})

result

输出:

{5: {'id': 5, 'parentid': 0, 'pcid': '5', 'level': 0, 'children': []},
 4: {'id': 4,
  'parentid': 0,
  'pcid': '4',
  'level': 0,
  'children': [{'id': 991, 'parentid': 4, 'pcid': '4_2', 'level': '2'},
   {'id': 992, 'parentid': 4, 'pcid': '4_3', 'level': '3'},
   {'id': 989, 'parentid': 4, 'pcid': '4_1', 'level': '1'}]}}

相关问题 更多 >