Python dict加法
我有两个这样的口述Python dict加法,python,python-2.7,Python,Python 2.7,我有两个这样的口述 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':
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 2.7版)作为嵌套dict处理分层数据总是很痛苦的;您最好使用以下库:
非常好的解决方案,谢谢。我要学熊猫:-)。因此,如果我们要使用嵌套的dict,最好使用类似熊猫的库。“我说得对吗?”约翰帕温:是的,当然。
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