我试着从字典的列表中找出一个数据。我在这整个编程方面都是新手,而谷歌只是让我更加困惑。这就是为什么我要向你们寻求帮助的原因。前两个列表值(if 01‘,'3nP3RFgGnBrOfILK4DF2Tp)希望在名为: Name和GlobalId的列下。我会欺骗地删除Pset_wallcommon、AC_Pset_RenovationAndPhasing和BaseQuantities,并使用其余的键(如果是它们的名称)作为列名。
如果有人能给我正确的推动,那就太好了:)
记录在案:我正在用IfcOpenshell包解析一个Ifc文件
数据:
[‘AC 01’,'3nP3RFgGnBrOfILK4DF2Tp',{'Pset_WallCommon':{‘可燃’:假,‘分隔’:假,'ExtendToStructure':False,'SurfaceSpreadOfFlame':'',‘热发射’:0.0,‘Reference’,'AcousticRating':‘,'FireRating':'',’承载‘:False’,'IsExternal':False},'AC_Pset_RenovationAndPhasing':{‘Status':'New'},“基本数量”:{“长度”:13786.7314346,“高度”:2700.0,“宽度”:276.0,“Gross足NetSideArea”:3.88131387595,“Net足NetSideArea”:3.88131387595,“GrossSideArea”:37.9693748734,“NetSideArea”:37.9693748734,“Gross卷”:10.4795474651,“NetVolume”:10.4795474651}},“YV01 01”,“1M4JyBhXD5xt8fBFUjUU”,{'Pset_WallCommon':{‘Pset_WallCommon’:{‘可燃’:假,‘划分’:假,‘扩展结构’,‘'SurfaceSpreadOfFlame':'','ThermalTransmittance':0.0,'Reference':'','AcousticRating':'','FireRating':'',’承载‘:False’,'IsExternal':False},'AC_Pset_RenovationAndPhasing':{‘更新状态’:‘新’},‘基本数量级’:{‘长度’:6166.67382573,‘高度’:2700.0,‘宽度’:276.0,'GrossFootprintArea':1.6258259759,“Net足NetSideArea”:1.6258259759,“GrossSideArea”:15.9048193295,“NetSideArea”:15.9048193295,“Gross音量”: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/记录器/数组(数据),但是输出如下所示
更新:非常感谢你的帮助,我从中学到了很多东西!所以我用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)它看起来工作得很好,唯一的问题是dataframe包含所有的墙壁,但是只有列表中第一个的属性集数据。我似乎不明白dict扁平循环是如何工作的。我还希望索引名(Pset_WallCommon_Combustible,等等)成为我的dataframe中的列。这有可能吗?
发布于 2021-05-26 12:50:52
编辑:简单地压平一个列表,因为我没有去任何地方。实际上,我认为您应该完全放弃这个列表,并尝试从一个字典加载Dataframe。我们需要看看all_walls是什么样子来帮助你,所以。
您是否尝试过将all_walls字典直接加载到dataframe: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] = valuehttps://stackoverflow.com/questions/67703975
复制相似问题