如何将压缩格式的 SVMlight 格式文件加载到 pandas?

How to load SVMlight format files in compressed form to pandas?

我有 SVMlight 格式的数据(标签 feature1:value1 feature2:v2 ...)

talk.politics.guns a:12 about:1 abrams:1 absolutely:1
talk.politics.mideast I:4 run:10 go:3

我试过 sklearn.load_svmlight_file 但它似乎不适用于分类字符串特征和标签。我正在尝试将其存储到 pandas DataFrame 中。任何指针将不胜感激。

你可以手工完成... 在 DataFrame 中转换所需文件的一种方法:

svmformat_file = """~/svmformat_file_sample"""

# Read to list
with open(svmformat_file, mode="r") as fp:
    svmformat_list = fp.readlines()

# For each line we save the key:values to a dict
pandas_list = []
for line in svmformat_list:
    line_dict = dict()

    line_split = line.split(' ')
    line_dict["label"] = line_split[0]

    for col in line_split[1:]:
        col = col.rstrip()  # Remove '\n'
        col_split = col.split(':')
        key, value = col_split[0], col_split[1]
        line_dict[key] = value

    pandas_list.append(line_dict)

带有示例文件的结果 DataFrame:

pd.DataFrame(pandas_list)

我想指出,如果您的单词之一是 'label',Christian Gomes 接受的答案将失败,因为您将用向量中单词的计数覆盖分类标签.此外,由于计数未转换为 int,您无法进行任何数学运算。

由于您确定每个(特征、值)对由 : 分隔,因此您可以通过将 'label' 键设为 ':label' 来解决这个问题。不太理想,但可以避免碰撞。

或者,您可以将标签存储在单独的数据框中,这可能是更好的解决方案,因为您可能不想对分类标签进行数学运算。

svmformat_file = """~/svmformat_file_sample"""

# Read to list
with open(svmformat_file, mode="r") as fp:
    svmformat_list = fp.read().splitlines()

# For each line we save the key:values to a dict
pandas_label_list = []
pandas_feature_list = []
for line in svmformat_list:
    feature_dict = {}

    items = line.split()
    pandas_label_list.append({'label': items[0]})

    for pair in items[1:]:
        feature_name, count = pair.split(':')
        feature_dict[feature_name] = int(count)

    pandas_feature_list.append(feature_dict)

然后,使用 Christian 使用的相同数据,您现在有两个数据帧:

>>> pd.DataFrame(pandas_label_list)
>>>                 label
0   talk.politics.guns
1   talk.politics.mideast
>>> pd.DataFrame(pandas_feature_list)
>>> a about abrams absolutely   I run  go
0  12     1      1          1 NaN NaN NaN
1 NaN   NaN    NaN        NaN   4  10   3