3

我有两个这样的字典,

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}
    }
}

添加它们我已经这样做了,

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
}

得到了想要的输出,

{
   '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}
    }
}

但是,应该有比这更好的解决方案,我用谷歌搜索并发现了类似的问题,

在 Python 中“添加”字典?

python dict.add_by_value(dict_2)?

但值在顶层,但在我的情况下,值不在顶层,我必须进行类型检查并且必须计算平均值。解决此问题的最佳方法是什么。

(Python 2.7 版)

4

1 回答 1

1

将分层数据作为嵌套字典处理总是很痛苦的;你最好使用像Pandas这样的库:

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
于 2013-08-05T12:57:29.447 回答