2017-04-25 104 views
1

我有像下面这样的熊猫数据框。如何将熊猫数据框转换为libsvm格式?

df 
Out[50]: 
    0 1 2 3 4 5 6 7 8 9 ... 90 91 92 93 94 95 96 97 \ 
0 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 
1 0 1 1 1 0 0 1 1 1 1 ... 0 0 0 0 0 0 0 0 
2 1 1 1 1 1 1 1 1 1 1 ... 0 0 0 0 0 0 0 0 
3 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 
4 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 
5 1 0 0 1 1 1 1 0 0 0 ... 0 0 0 0 0 0 0 0 
6 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 
7 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 

[8 rows x 100 columns] 

我有目标变量作为如下的阵列。

[1, -1, -1, 1, 1, -1, 1, 1] 

如何将此目标变量映射到数据框并将其转换为lib SVM格式?

equi = {0:1, 1:-1, 2:-1,3:1,4:1,5:-1,6:1,7:1} 
df["labels"] = df.index.map[(equi)] 
d = df[np.setdiff1d(df.columns,['indx','labels'])] 
e = df.label 
dump_svmlight_file(d,e,'D:/result/smvlight2.dat')er code here 

错误:

File "D:/spyder/april.py", line 54, in <module> 
df["labels"] = df.index.map[(equi)] 

TypeError: 'method' object is not subscriptable 

当我使用

df["labels"] = df.index.list(map[(equi)]) 

错误:

AttributeError: 'RangeIndex' object has no attribute 'list' 

请帮我解决这些错误。

回答

1

我想你需要转换indexto_series然后调用map

df["labels"] = df.index.to_series().map(equi) 

或者使用renameindex的:

df["labels"] = df.rename(index=equi).index 

一起:

对于列大熊猫的差异有difference

from sklearn.datasets import dump_svmlight_file 

equi = {0:1, 1:-1, 2:-1,3:1,4:1,5:-1,6:1,7:1} 

df["labels"] = df.rename(index=equi).index 
e = df["labels"] 
d = df[df.columns.difference(['indx','labels'])] 

dump_svmlight_file(d,e,'C:/result/smvlight2.dat') 

而且似乎label列是没有必要的:

from sklearn.datasets import dump_svmlight_file 

equi = {0:1, 1:-1, 2:-1,3:1,4:1,5:-1,6:1,7:1} 
e = df.rename(index=equi).index 
d = df[df.columns.difference(['indx'])] 
dump_svmlight_file(d,e,'C:/result/smvlight2.dat') 
+0

我用的第一个选项。清除错误。谢谢 – banu

+0

但是现在下一个错误出现在下一行。 – banu

+0

TypeError:'>'不支持'str'和'int'的实例 – banu