Pandas 从Brightway2中的MultiLCA结果创建数据帧

Pandas 从Brightway2中的MultiLCA结果创建数据帧,pandas,brightway,Pandas,Brightway,我试图从多重生命周期分析计算的结果中创建一个数据框架,使用方法作为列,功能单元作为行。我确实找到了一种解决方案,但有点麻烦(我不太擅长使用字典) 有没有更优雅的方法?名字也很长,但这是另一回事…我觉得你的代码相对优雅。如果您想坚持使用str(key),则可以通过列表理解将其简化: mlca=MultiLCA("my_calculation_setup") dfresults = pd.DataFrame(mlca.results, columns=mlca.methods) dfresults

我试图从多重生命周期分析计算的结果中创建一个数据框架,使用方法作为列,功能单元作为行。我确实找到了一种解决方案,但有点麻烦(我不太擅长使用字典)


有没有更优雅的方法?名字也很长,但这是另一回事…

我觉得你的代码相对优雅。如果您想坚持使用
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)
请注意,只有当您的需求字典每个都有一个活动时,这才有效。您可能会遇到这样的情况:一个demand dictionary将有两个活动(如
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)
但是,在一般情况下,数据帧并不是计算设置的完美匹配。当一个demand dictionary有多个活动时,没有很好的方法将其“压缩”到一个维度或一行中

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)