如何将压缩格式的 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
我有 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