从Brightway2中的MultiLCA结果创建数据框

时间:2017-03-23 19:03:01

标签: pandas brightway

我正在尝试从MultiLCA计算的结果创建一个pandas数据框,使用方法作为列,使用功能单元作为行。我确实找到了一种解决方案,但它有点麻烦(我对字典不是很好)

...
mlca=MultiLCA("my_calculation_setup")
pd.DataFrame(mlca.results,columns=mlca.methods)

fu_names=[]

for d in mlca.func_units:
    for key in d:
        fu_names.append(str(key))

dfresults['fu']=fu_names
dfresults.set_index('fu',inplace=True)

有更优雅的方式吗?名字也很长,但这是一个不同的故事......

1 个答案:

答案 0 :(得分:0)

你的代码对我来说似乎相对优雅。如果你想坚持str(key),那么你可以通过列表理解来简化它:

mlca=MultiLCA("my_calculation_setup")
dfresults = pd.DataFrame(mlca.results, columns=mlca.methods)

dfresults['fu'] = [str(key) for demand in mlca.func_units for key in demand]
dfresults.set_index('fu', inplace=True)

请注意,这仅适用于您的需求词典各有一个活动。您可能会遇到一个需求字典会有两个活动(如LCA({'foo': 1, 'bar': 2}))的情况,这会导致失败,因为fu列表中的元素太多了。

如果您确实知道每个需求只有一个活动,那么您可以按如下方式制作更好的数据框:

mlca=MultiLCA("my_calculation_setup")
scores = pd.DataFrame(mlca.results, columns=mlca.methods)

as_activities = [
    (get_activity(key), amount) 
    for dct in mlca.func_units 
    for key, amount in dct.items()
]
nicer_fu = pd.DataFrame(
    [
        (x['database'], x['code'], x['name'], x['location'], x['unit'], y) 
        for x, y in as_activities
    ], 
    columns=('Database', 'Code', 'Name', 'Location', 'Unit', 'Amount')
)
nicer = pd.concat([nicer_fu, scores], axis=1)

但是,在一般情况下,数据帧不是计算设置的完美匹配。当需求词典有多个活动时,没有很好的方法来压缩"压缩"这可以分为一个维度或一行。