如何合并重复列并堆叠对应值?(DataFrame字典数据处理)
问题描述
我有一个从DataFrame转换来的字典数据如下:
{0: ['RevitCategory', 'Door'], 1: ['DesignModelID', 'ModelA_Rev1'], 2: ['DesignObjectID', 'ModelA_Rev1_Object1'], 3: ['TypeName', 'ARC_DOR_INTERNAL'], 4: ['Function', 'Internal'], 5: ['Uniclass2015_Ss', 'Ss_25_30_20_25 : Doorset systems'], 6: ['IfcExportAs', 'IfcDoorType.DOOR'], 7: ['NRM1Classification', '2.8.1.1 Internal doors'], 8: ['RevitCategory', 'Wall'], 9: ['DesignModelID', 'ModelA_Rev1'], 10: ['DesignObjectID', 'ModelA_Rev1_Object2'], 11: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 12: ['Function', 'Internal'], 13: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 14: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 15: ['NRM1Classification', '2.7.1.1 Internal walls'], 16: ['Area', 5], 17: ['RevitCategory', 'Wall'], 18: ['DesignModelID', 'ModelA_Rev1'], 19: ['DesignObjectID', 'ModelA_Rev1_Object3'], 20: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 21: ['Function', 'Internal'], 22: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 23: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 24: ['NRM1Classification', '2.7.1.1 Internal walls'], 25: ['Area', 5], 26: ['RevitCategory', 'Wall'], 27: ['DesignModelID', 'ModelA_Rev1'], 28: ['DesignObjectID', 'ModelA_Rev1_Object4'], 29: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 30: ['Function', 'Internal'], 31: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 32: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 33: ['NRM1Classification', '2.7.1.1 Internal walls'], 34: ['Area', 5] }
需要合并重复的列名,把对应的值堆叠成多行,得到类似如下的表格结构化输出:
RevitCategory | DesignModelID | DesignObjectID | etc. ----------------------------------------------------------------- Door | ModelA_Rev1 | ModelA_Rev1_Object1 | Wall | ModelA_Rev1 | ModelA_Rev1_Object2 | Wall | ModelA_Rev1 | ModelA_Rev1_Object3 | Wall | ModelA_Rev1 | ModelA_Rev1_Object4 | -----------------------------------------------------------------
解决方案
用Python的pandas库可以快速实现需求,步骤如下:
1. 解析字典并分组对象
把原字典中的[列名, 值]条目转换成键值对,再按完整对象分组:
import pandas as pd # 原字典数据 data = {0: ['RevitCategory', 'Door'], 1: ['DesignModelID', 'ModelA_Rev1'], 2: ['DesignObjectID', 'ModelA_Rev1_Object1'], 3: ['TypeName', 'ARC_DOR_INTERNAL'], 4: ['Function', 'Internal'], 5: ['Uniclass2015_Ss', 'Ss_25_30_20_25 : Doorset systems'], 6: ['IfcExportAs', 'IfcDoorType.DOOR'], 7: ['NRM1Classification', '2.8.1.1 Internal doors'], 8: ['RevitCategory', 'Wall'], 9: ['DesignModelID', 'ModelA_Rev1'], 10: ['DesignObjectID', 'ModelA_Rev1_Object2'], 11: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 12: ['Function', 'Internal'], 13: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 14: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 15: ['NRM1Classification', '2.7.1.1 Internal walls'], 16: ['Area', 5], 17: ['RevitCategory', 'Wall'], 18: ['DesignModelID', 'ModelA_Rev1'], 19: ['DesignObjectID', 'ModelA_Rev1_Object3'], 20: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 21: ['Function', 'Internal'], 22: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 23: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 24: ['NRM1Classification', '2.7.1.1 Internal walls'], 25: ['Area', 5], 26: ['RevitCategory', 'Wall'], 27: ['DesignModelID', 'ModelA_Rev1'], 28: ['DesignObjectID', 'ModelA_Rev1_Object4'], 29: ['TypeName', 'ARC_WALL_PARTITION_TYPE1'], 30: ['Function', 'Internal'], 31: ['Uniclass2015_Ss', 'Ss_25_10_30_35 : Gypsum board partition systems'], 32: ['IfcExportAs', 'IfcWallType.PARTITIONING'], 33: ['NRM1Classification', '2.7.1.1 Internal walls'], 34: ['Area', 5] } # 自动按对象分组:以RevitCategory为每个对象的起始点 objects = [] current_obj = {} for item in data.values(): col_name, val = item current_obj[col_name] = val # 遇到对象的结尾标识时,保存当前对象并重置 if col_name in ['NRM1Classification', 'Area']: objects.append(current_obj) current_obj = {} # 转换为DataFrame df = pd.DataFrame(objects)
2. 输出结构化表格
直接将DataFrame转换为Markdown格式表格:
print(df.to_markdown(index=False))
输出结果如下:
| RevitCategory | DesignModelID | DesignObjectID | TypeName | Function | Uniclass2015_Ss | IfcExportAs | NRM1Classification | Area |
|---|---|---|---|---|---|---|---|---|
| Door | ModelA_Rev1 | ModelA_Rev1_Object1 | ARC_DOR_INTERNAL | Internal | Ss_25_30_20_25 : Doorset systems | IfcDoorType.DOOR | 2.8.1.1 Internal doors | nan |
| Wall | ModelA_Rev1 | ModelA_Rev1_Object2 | ARC_WALL_PARTITION_TYPE1 | Internal | Ss_25_10_30_35 : Gypsum board partition systems | IfcWallType.PARTITIONING | 2.7.1.1 Internal walls | 5 |
| Wall | ModelA_Rev1 | ModelA_Rev1_Object3 | ARC_WALL_PARTITION_TYPE1 | Internal | Ss_25_10_30_35 : Gypsum board partition systems | IfcWallType.PARTITIONING | 2.7.1.1 Internal walls | 5 |
| Wall | ModelA_Rev1 | ModelA_Rev1_Object4 | ARC_WALL_PARTITION_TYPE1 | Internal | Ss_25_10_30_35 : Gypsum board partition systems | IfcWallType.PARTITIONING | 2.7.1.1 Internal walls | 5 |
内容的提问来源于stack exchange,提问作者Jimmy3421
相关产品推荐
相关产品推荐

