1

I want to transform to a specific nested dictionary format. The dataframe df looks like this:

    OC  OZ  ON  WT  DC  DZ  DN
0   PL  97  TP  59  DE  63  DC 
3   US  61  SU  9   US  95  SU

The expected output is this:

{'location': 
        {
        'zipCode': 
            {'country': 'PL',
            'code': '97'},
        'location': {'id': '1'}, 
        'longName': 'TP',  
            },
    'CarriageParameter': 
         {'road': 
              {'truckLoad': 'Auto'}
            },
    'load': 
         {'weight': '59',
          'unit': 'ton',
          'showEmissionsAtResponse': 'true'
         }
    },
    {'location': 
        {
        'zipCode': 
            {'country': 'DE',
            'code': '63'},
        'location': {'id': '2'}, 
        'longName': 'DC']
        },
        'CarriageParameter':
             {'road': 
                 {'truckLoad': 'Auto'}
            },      
        'unload': {
            'weight': '59'),
            'unit': 'ton',
            'showEmissionsAtResponse': 'true'
        }
}

I've tried this code below but i am only getting one part of the dictionary:

dic = {}
dic['section'] = []
for ix, row in df.iterrows():
    in_dict1 = {
    'location': 
        {
        'zipCode': 
            {'country': row['OC'],
            'code': row['OZ']},
        'location': {'id': '1'}, 
        'longName': row['ON'],  
            },
    'CarriageParameter': 
         {'road': 
              {'truckLoad': 'Auto'}
            },
    'load': 
         {'weight': str(row['WT']),
          'unit': 'ton',
          'showEmissionsAtResponse': 'true'
         }
    },
    in_dict2 = {'location': 
        {
        'zipCode': 
            {'country': row['DC'],
            'code': row['DZ']},
        'location': {'id': '2'}, 
        'longName': row['DN']
        },
        'CarriageParameter':
             {'road': 
                 {'truckLoad': 'Auto'}
            },      
        'unload': {
            'weight': str(row['WT']),
            'unit': 'ton',
            'showEmissionsAtResponse': 'true'
        }
        }
    dic['section'].append(in_dict1)

the pretty print of the first row below:

{'section': [{'CarriageParameter': {'road': {'truckLoad': 'Auto'}},
              'load': {'showEmissionsAtResponse': 'true',
                       'unit': 'ton',
                       'weight': '59'},
              'location': {'location': {'id': '1'},
                           'longName': 'TP COLEP_GRABICA PL',
                           'zipCode': {'code': '97-306', 'country': 'PL'}}}]}

I would expect the second part of the dictionary it's kind of lost somewhere...

How to fix this issue ?

1
  • looks like you didn't append in_dict2 to your list Commented Jul 2, 2020 at 1:00

1 Answer 1

2

It's because you didn't add the second dictionary, you could try this:

import pandas as pd
import io

s_e='''
    OC  OZ  ON  WT  DC  DZ  DN
0   PL  97  TP  59  DE  63  DC 
3   US  61  SU  9   US  95  SU
'''
df = pd.read_csv(io.StringIO(s_e), sep='\s\s+', parse_dates=[1,2], engine='python')

dic = {}
dic['section'] = []
for ix, row in df.iterrows():
    in_dict1 = {
    'location': 
        {
        'zipCode': 
            {'country': row['OC'],
            'code': row['OZ']},
        'location': {'id': '1'}, 
        'longName': row['ON'],  
            },
    'CarriageParameter': 
         {'road': 
              {'truckLoad': 'Auto'}
            },
    'load': 
         {'weight': str(row['WT']),
          'unit': 'ton',
          'showEmissionsAtResponse': 'true'
         }
    }
    in_dict2 = {'location': 
        {
        'zipCode': 
            {'country': row['DC'],
            'code': row['DZ']},
        'location': {'id': '2'}, 
        'longName': row['DN']
        },
        'CarriageParameter':
             {'road': 
                 {'truckLoad': 'Auto'}
            },      
        'unload': {
            'weight': str(row['WT']),
            'unit': 'ton',
            'showEmissionsAtResponse': 'true'
        }
        }
    dic['section'].append(in_dict1)
    dic['section'].append(in_dict2)
    
print(dic['section'])

Output:

[{'location': {'zipCode': {'country': 'PL', 'code': 97}, 'location': {'id': '1'}, 'longName': 'TP'}, 'CarriageParameter': {'road': {'truckLoad': 'Auto'}}, 'load': {'weight': '59', 'unit': 'ton', 'showEmissionsAtResponse': 'true'}}, {'location': {'zipCode': {'country': 'DE', 'code': 63}, 'location': {'id': '2'}, 'longName': 'DC'}, 'CarriageParameter': {'road': {'truckLoad': 'Auto'}}, 'unload': {'weight': '59', 'unit': 'ton', 'showEmissionsAtResponse': 'true'}}, {'location': {'zipCode': {'country': 'US', 'code': 61}, 'location': {'id': '1'}, 'longName': 'SU'}, 'CarriageParameter': {'road': {'truckLoad': 'Auto'}}, 'load': {'weight': '9', 'unit': 'ton', 'showEmissionsAtResponse': 'true'}}, {'location': {'zipCode': {'country': 'US', 'code': 95}, 'location': {'id': '2'}, 'longName': 'SU'}, 'CarriageParameter': {'road': {'truckLoad': 'Auto'}}, 'unload': {'weight': '9', 'unit': 'ton', 'showEmissionsAtResponse': 'true'}}]
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for your answer but it keep adding the previous row. How can i fix this ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.