Python dict addition
Question: I have two dicts like this,

    
    
    past = 
    {
         '500188':
         {
             2: {'S': 16.97011741552128, 'C': 16.97011741552128},
             3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
             4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
         }, 
         '524715':
         {
             2: {'S': 46.21665549733925, 'C': 38.67504905630727},
             3: {'S': -32.729615295373385, 'C': -34.21172523465267},
             4: {'S': -22.25028773515787, 'C': -36.041635048402}
         },
         '513683':
         {
             2: {'S': 6.319158390481139, 'C': 6.319158390481139},
             3: {'S': 19.81072942574542, 'C': 19.81072942574542},
             4: {'S': 6.367182731764687, 'C': 'ERROR: reported_eps value not found for the year 2008.'}
         }
    }
    
    future =
    {
        '500188':
        {
            2: {'S': 16.97011741552128, 'C': 16.97011741552128},
            3: {'S': -41.264072314989576, 'C': 'ERROR: reported_eps value not found for the year 2012.'},
            4: {'S': -40.45410186823402, 'C': 'ERROR: reported_eps value not found for the year 2012.'}
        }, 
        '524715':
        {
            2: {'S': 46.21665549733925, 'C': 38.67504905630727},
            3: {'S': -32.729615295373385, 'C': -34.21172523465267},
            4: {'S': -22.25028773515787, 'C': -36.041635048402}
        }
    }
    

to add them I have done this,

    
    
    def _float(value):
        try: 
            return float(value)
        except ValueError:
            return 0
    
    
    print {key: 
        {
            year: {
                    _type: 
                    (_float(past.get(key, {}).get(year, {}).get(_type, 0)) + _float(future.get(key, {}).get(year, {}).get(_type, 0)))/2  for _type in ['S', 'C']
    
            }for year in [4,3,2] #Second Loop
    
        }for key in set(past.keys()+future.keys()) #First Loop
    }
    

got the desired output,

    
    
    {
       '500188':
        {
           2: {'S': 16.97011741552128, 'C': 16.97011741552128},
           3: {'S': -41.264072314989576, 'C': 0},
           4: {'S': -40.45410186823402, 'C': 0}
        },
        '513683':
        {
           2: {'S': 3.1595791952405694, 'C': 3.1595791952405694},
           3: {'S': 9.90536471287271, 'C': 9.90536471287271},
           4: {'S': 3.1835913658823434, 'C': 0.0}
        },
       '524715':
        {
           2: {'S': 46.21665549733925, 'C': 38.67504905630727},
           3: {'S': -32.729615295373385, 'C': -34.21172523465267},
           4: {'S': -22.25028773515787, 'C': -36.041635048402}
        }
    }
    

But, there should be some better solution than this, I googled and found this
similar questions,

["Adding" Dictionaries in
Python?](http://stackoverflow.com/questions/1031199/adding-dictionaries-in-
python)

[python
dict.add_by_value(dict_2)?](http://stackoverflow.com/questions/877295/python-
dict-add-by-valuedict-2/1027258#1027258)

but the values are in top level, but in my case the value is not in top level
and I have to do a type check and have to calculate mean. what is the best way
to solve this.

(Python version 2.7)


Answer: Working with hierarchical data as nested dicts is always going to be painful;
you're better off using a library like [Pandas](http://pandas.pydata.org/):

    
    
    import pandas as pd, numpy as np
    pp = pd.Panel(past).to_frame()
    pf = pd.Panel(future).to_frame()
    pp.replace('.', 0, regex=True) + pf.replace('.', 0, regex=True) / 2
    
                    500188  513683     524715
    major minor                              
    C     2      25.455176     NaN  58.012574
          3       0.000000     NaN -51.317588
          4       0.000000     NaN -54.062453
    S     2      25.455176     NaN  69.324983
          3     -61.896108     NaN -49.094423
          4     -60.681153     NaN -33.375432
    

