使用来自pandas DataFrame

时间:2017-10-04 04:00:20

标签: python pandas numpy dataframe scikit-learn

我正在尝试使用SVM,但是当我使用pandas数据框时,我不知道如何适应模型。如果我的数据如下所示:

df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]})
df.x.apply(lambda x: np.array(list(map(int,x))))
>>>df
    x           y
0   [0, 1, 1]   0
1   [1, 0, 0]   1
2   [1, 1, 1]   0

如果我试图以这种方式拟合模型:

clf = svm.SVC().fit(df.x, df.y)

我收到此错误:

ValueError: setting an array element with a sequence.

使用此数据框适合SVM的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]})
df.x = df.x.apply(lambda x: list(map(int,x)))

df
           x  y
0  [0, 1, 1]  0
1  [1, 0, 0]  1
2  [1, 1, 1]  0

df.x是一列数组。这可能不是存储数据的最佳方式,看起来sklearn并不是非常擅长理解数据。将所有内容转换为列表列表并将 传递给SVC会更简单。试试这个:

x = df.x.tolist()
print(x)
[[0, 1, 1], [1, 0, 0], [1, 1, 1]]
SVC().fit(x, df.y)

答案 1 :(得分:2)

另一个解决方案是下面的代码。

import pandas as pd
import numpy as np

from sklearn.svm import SVC

df = pd.DataFrame({"x": ['011', '100', '111'] , "y": [0,1,0]})
x = df.x.apply(lambda x: pd.Series(list(x)))
x
# Out[2]:
#    0  1  2
# 0  0  1  1
# 1  1  0  0
# 2  1  1  1

SVC().fit(x, df.y)
# Out[3]:
# SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
#   decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
#   max_iter=-1, probability=False, random_state=None, shrinking=True,
#   tol=0.001, verbose=False)

答案 2 :(得分:0)

import numpy as np
from sklearn.svm import SVC

# Convert your data frame's columns into arrays
features = df['x'].to_numpy()
labels = df['y'].to_numpy()

# feed into your classifier 
SVC().fit(features,labels)