मैं एक डेटाफ्रेम को नेस्टेड डिक्शनरी में बदलने की कोशिश कर रहा हूं लेकिन अब तक कोई सफलता नहीं मिली है।

डेटाफ़्रेम: clean_data['Model', 'Problem', 'Size']

यहां बताया गया है कि मेरा डेटा कैसा दिखता है:

 Model                Problem             Size
 lenovo a6020         screen broken         1
 lenovo a6020a40      battery              60
                      bluetooth            60
                      buttons              60
 lenovo k4            wi-fi                 3
                      bluetooth             3

मेरा वांछित आउटपुट:

{
  "name": "Brand",
  "children": [
     {
         "name": "Lenovo",
         "children": [
             {
              "name": "lenovo a6020",
              "children": {
                  "name": "screen broken",
                  "size": 1
               }
             },
             {
              "name": "lenovo a6020a40",
              "children": [
                 {
                   "name": "battery",
                   "size": 60
                 },
                 {
                   "name": "bluetooth",
                   "size": 60
                 },
                 {
                   "name": "buttons",
                   "size": 60
                 }
               ]
             },
             {
              "name": "lenovo k4",
              "children": [
                {
                  "name": "wi-fi",
                  "size": 3
                },
                {
                  "name": "bluetooth",
                  "size": 3
                }
               ]
            }
         ]
      }
   ]
 }

मैंने pandas.DataFrame.to_dict विधि की कोशिश की है लेकिन यह एक साधारण शब्दकोश लौटा रहा है लेकिन मैं इसे ऊपर वर्णित की तरह चाहता हूं।

2
Rohit Swami 27 सितंबर 2018, 15:01

1 उत्तर

सबसे बढ़िया उत्तर

उपयोग:

print (df)
             Model        Problem  size
0     lenovo a6020  screen broken     1
1  lenovo a6020a40        battery    60
2              NaN      bluetooth    60
3              NaN        buttons    60
4        lenovo k4          wi-fi     3
5              NaN      bluetooth     3

 #repalce missing values by forward filling
df = df.ffill()
#split Model column by first whitesapces to 2 columns 
df[['a','b']] = df['Model'].str.split(n=1, expand=True)

#each level convert to list of dictionaries
#for correct keys use rename
L = (df.rename(columns={'Problem':'name'})
        .groupby(['a','b'])['name','size']
        .apply(lambda x: x.to_dict('r'))
        .rename('children')
        .reset_index()
        .rename(columns={'b':'name'})
        .groupby('a')['name','children']
        .apply(lambda x: x.to_dict('r'))
        .rename('children')
        .reset_index()
        .rename(columns={'a':'name'})
        .to_dict('r')
        )
#print (L)

#create outer level by contructor
d = { "name": "Brand", "children": L}

print (d)

{
    'name': 'Brand',
    'children': [{
        'name': 'lenovo',
        'children': [{
            'name': 'a6020',
            'children': [{
                'name': 'screen broken',
                'size': 1
            }]
        }, {
            'name': 'a6020a40',
            'children': [{
                'name': 'battery',
                'size': 60
            }, {
                'name': 'bluetooth',
                'size': 60
            }, {
                'name': 'buttons',
                'size': 60
            }]
        }, {
            'name': 'k4',
            'children': [{
                'name': 'wi-fi',
                'size': 3
            }, {
                'name': 'bluetooth',
                'size': 3
            }]
        }]
    }]
}
6
jezrael 27 सितंबर 2018, 15:20