我有两个像这样的词,
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}
}
}
但是,应该有比这更好的解决方案,我用Google搜索并发现了类似的问题,
"Adding" Dictionaries in Python?
python dict.add_by_value(dict_2)?
但值是顶级,但在我的情况下,该值不在顶级,我必须进行类型检查,并且必须计算平均值。什么是解决这个问题的最佳方法。
(Python版本2.7)
答案 0 :(得分:1)
使用分层数据作为嵌套dicts总是很痛苦;你最好使用像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