如何将groupby()。mean()转换为可调用对象?

时间:2016-07-16 13:45:54

标签: pandas scikit-learn

我有以下非常简单的模型,在运行它时遇到错误消息。错误是

Traceback (most recent call last):
File "mltest.py", line 63, in <module>
pred = B.predict(ms,r[0:10])
File "mltest.py", line 54, in predict
return map(self.means['score'][X], X)
TypeError: 'Series' object is not callable

模型结构如下:

from sklearn.base import BaseEstimator, ClassifierMixin
import pandas as pd

class MeanClassifier(BaseEstimator, ClassifierMixin):
    def __init__(self):
        pass

    def fit(self, X, y):
        self.name = X
        self.scores = y  
        self.data = pd.DataFrame({"name": self.name, "score": self.scores})
        #print(self.data)
        self.means = self.data.groupby(["name"]).mean()
        #print(self.means)
        return self

    def predict(self, X):
        return map(self.means['score'][X], X)

然后我有一个X(名称)和y(分数)列表,用于模型拟合和预测。当我测试我的代码时,我只是使用相同的数据进行模型拟合和预测。

names = ["John", "Mary", "Suzie", "John", "John", "Mary", "Suzie"]
scores = [80, 70, 75, 90, 92, 82, 88]
B = MeanClassifier()
Bfit = B.fit(names, scores)
Bpred = B.predict(names)

显然,在我使用groupby(['name']).mean()之后,错误来自数据类型。此对象不可调用,因此映射在此处不起作用。谁能给我一个如何解决这个问题的建议?谢谢!!

1 个答案:

答案 0 :(得分:2)

在您的估算工具课程中,self.means是一个索引为name的DataFrame和一个名为score的列。将您的predict功能更改为

def predict(self, X):
    return self.means.loc[X, 'score']

.loc获取索引标签(或其列表)和列标签(或其列表),因此上面返回一个系列(因为您正在访问一列),其中包含列中的值score中所有姓名的X