You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 12:54:02