数据框的字典列表

List of dictionarys to dataframe

我正在尝试从字典列表中创建一个数据框。我对这整个编程事情还很陌生,google 只会让我更加困惑。这就是为什么我转向你们希望得到一些帮助。 前两个列表值(YV01'、'3nP3RFgGnBrOfILK4DF2Tp)我想在名为:Name 和 GlobalId 的列下。我会撒谎删除 Pset_wallcommon、AC_Pset_RenovationAndPhasing 和 BaseQuantities。并使用其余的键(如果它们被称为)作为列名。

如果有人能给我正确的推送就太好了:)

郑重声明:我正在使用 IfcOpenshell 包解析 Ifc 文件

数据:
['YV01', '3nP3RFgGnBrOfILK4DF2Tp', {'Pset_WallCommon': {'Combustible': 假, 'Compartmentation': 假, 'ExtendToStructure': 假, 'SurfaceSpreadOfFlame': ' ', 'ThermalTransmittance': 0.0, 'Reference': '', 'AcousticRating': '', 'FireRating': '', 'LoadBearing': 假, 'IsExternal' : 假}, 'AC_Pset_RenovationAndPhasing': {'Renovation Status': 'New'}, 'BaseQuantities': {'Length': 13786.7314346, 'Height': 2700.0, 'Width':276.0,'GrossFootprintArea':3.88131387595,'NetFootprintArea':3.88131387595,'GrossSideArea':37.9693748734,'NetSideArea':37.9693748734,'GrossVolume':10.4795474651,'NetVolume' : 10.4795474651}}, 'YV01', '1M4JyBJhXD5xt8fBFUcjUU', {'Pset_WallCommon': {'Combustible': 假, 'Compartmentation': 假, 'ExtendToStructure': 假, 'SurfaceSpreadOfFlame': '', 'ThermalTransmittance': 0.0, 'Reference': '', 'AcousticRating': '', 'FireRating': '', 'LoadBearing': 假, 'IsExternal':假},'AC_Pset_RenovationAndPhasing':{'Renovation Status':'New'},'BaseQuantities':{'Length':6166.67382573,'Height':2700.0 , 'Width': 276.0, 'GrossFootprintArea': 1.6258259759, 'NetFootprintArea': 1.6258259759, 'GrossSideArea': 15.9048193295, 'NetSideArea': 15.9048193295, 'GrossVolume': 4.38973013494, 'NetVolume':4.38973013494}}

all_walls = ifc_file.by_type('IfcWall')
wallList = []

for wall in all_walls:
    propertySets = (ifcopenshell.util.element.get_psets(wall))
    wallList.append(wall.Name)
    wallList.append(wall.GlobalId)
    wallList.append(propertySets)
print(wallList)

wall_table = pd.DataFrame.from_records(wallList)
print(wall_table)

我试过这些基本的pd.DataFrame。from_dict/records/arrays(数据) 但输出看起来像这样

enter image description here

更新:非常感谢您的帮助,我从中学到了很多东西! 所以我用 wallList 制作了一本字典,并将字典展平。像这样:

 #list of walls
    for wall in all_walls:
        propertySets = (ifcopenshell.util.element.get_psets(wall))
        wallList.append(wall.Name)
        wallList.append(wall.GlobalId)
        wallList.append(propertySets)
    
    #dict from list
    wall_dict = {i: wallList[i] for i in range(0, len(wallList))}
    
    new_dict = {}
    #flattening dict
    for key, value in wall_dict.items():
        if isinstance(value, dict):
            for key in value.keys():
                for key2 in value[key].keys():
                    new_dict[key + '_' + key2] = value[key][key2]
        else:
            new_dict[key] = value
    
    
    wall_table = pd.DataFrame.from_dict(new_dict, orient='index')
    
    print(wall_table)

它似乎工作得很好,唯一的问题是数据框包含所有墙,但只包含列表中第一个的属性集数据。我似乎无法理解 dict 展平循环是如何工作的。我还希望索引名称(Pset_WallCommon_Combustible 等)成为我的数据框中的列。这可能吗?

enter image description here

编辑:像我所做的那样简单地展平列表是行不通的。实际上,我认为你应该完全放弃这个列表,并尝试从字典中加载 Dataframe。我们需要看看 all_walls 看起来像什么来帮助你,不过。

您是否尝试过直接将 all_walls 字典加载到数据框中:df = pd.Dataframe.from_dict(all_walls)

我认为如果这不起作用,以类似于以下的方式展平字典应该可以解决问题。

new_dict = {}
for key, value in all_walls.items():
    if isinstance(value, dict):
        for key in value.keys():
            for key2 in value[key].keys():
                new_dict[key + '_' + key2] = value[key][key2]
    else:
        new_dict[key] = value