在Pandas中读取自定义稀疏格式数据并转换为稠密DataFrame
自定义稀疏分类数据集转稠密DataFrame实现
该存储格式和通用的LibSVM稀疏规则逻辑一致,无需复杂预处理即可解析为稠密结构,核心流程如下:
- 逐行切分原始文本,提取每行第一个字段作为样本类别,独立存储为目标DataFrame的首列
- 将剩余字段按冒号拆分,自动剥离冒号前后的冗余空白,分别解析出属性编号(整数)和对应取值(浮点型,兼容省略前导0的小数格式)
- 统计所有样本中出现的属性编号范围,初始化全量属性列,未被样本覆盖的属性位置默认填充0
- 将每个样本的非零属性值填入对应列的位置,与类别列拼接为最终的稠密DataFrame
可直接运行的解析代码如下:
import pandas as pd # 实际使用时替换为本地文件读取逻辑即可 raw_sparse_content = """0 21:1.00 42:1.00 63:1.00 0 9: .18 18: .82 32: .15 36: .62 1 8:1.00 22: .06""" label_list = [] sample_attr_dict = [] all_used_attr = set() # 逐行解析 for line in raw_sparse_content.strip().split("\n"): line_parts = line.split() # 提取当前样本的类别 current_label = int(line_parts[0]) label_list.append(current_label) # 解析当前样本的所有非零属性 current_row_attr = {} for attr_item in line_parts[1:]: attr_id_str, attr_val_str = attr_item.split(":") attr_id = int(attr_id_str.strip()) attr_val = float(attr_val_str.strip()) current_row_attr[attr_id] = attr_val all_used_attr.add(attr_id) sample_attr_dict.append(current_row_attr) # 生成连续的属性列(从0到最大属性编号) max_attr_id = max(all_used_attr) attr_columns = [f"attr{idx}" for idx in range(max_attr_id + 1)] # 构造稠密矩阵 dense_matrix = [] for row_attr in sample_attr_dict: dense_row = [row_attr.get(attr_idx, 0.0) for attr_idx in range(max_attr_id + 1)] dense_matrix.append(dense_row) # 生成最终DataFrame result_df = pd.DataFrame(dense_matrix, columns=attr_columns) result_df.insert(0, "class", label_list)
适配说明
- 代码已经兼容原始数据中的常见格式问题:比如冒号后带空格、属性值省略前导0(如
.18、.06),不需要提前手动清洗文本 - 如果不需要生成从0到最大编号的连续空列,可将列生成逻辑调整为遍历排序后的
all_used_attr集合,只保留实际出现过的属性列,减少冗余维度 - 处理GB级大文件时,可将逐行解析逻辑替换为文件流逐行读取,不需要一次性加载全量数据,降低内存占用
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

