如何在Python中使用for循环追加函数生成的数据框

2 投票
1 回答
2220 浏览
提问于 2025-04-18 12:26

我有个问题,我写了一个函数,用来存储每个分类器中逐步模型的10折交叉验证得分。举个例子,对于朴素贝叶斯分类器,我有两个模型,一个只用一个变量,另一个用两个变量。决策树模型也是类似的。这个函数大概是这样的:

def crossV(clf):
    cvOutcome=pd.DataFrame()
    index=pd.DataFrame()
    classifier=pd.DataFrame()
    for i in range(4)[2:]:
        tt=array(tuple(x[1:i] for x in modelDataFullnew))
        qq=array(tuple(x[0] for x in modelDataFullnew))
        scores=cross_validation.cross_val_score(clf, tt, qq, cv=10)*100
        index_i=list(np.repeat(i-1,10))
        classifier_i=list(np.repeat(str(clf)[:-2],10))
        scores=list(scores)
        cvOutcome=cvOutcome.append(scores)
        index=index.append(index_i)
        classifier=classifier.append(classifier_i)
    merge=pd.concat([index,cvOutcome,classifier],axis=1)
    merge.columns=['model','rate','classifier']
    return(merge)

from sklearn.naive_bayes import GaussianNB as gnb
clf_nb=gnb()
from sklearn import tree
clf_dt=tree.DecisionTreeClassifier()

如果我执行 crossV(clf_nb),它会给我这样的结果:

    model   rate    classifier
   1     92.558679   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB

我的问题是,怎么才能把这个函数应用到多个分类器上,并把它们的结果合并成一个长的数据框,就像这样:

    model   rate    classifier
   1     92.558679   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB
   1     92.558381   GaussianNB
   1     93.25       DecisionTree
   1     93.25       DecisionTree

我试过这个代码,但它没有成功:

hhh=[clf_nb,clf_dt]

g=pd.DataFrame()
while i in hhh:
    g=g.append(crossV(i))

我还尝试在数组中使用map函数,像这样:

map(crossV,(clf_nb,clf_dt)) 

这个方法有效,但只给我一个更大的列表,我不知道怎么把它转换成数据框。

1 个回答

1

clf = [clf_nb, clf_dt]

cross_clf = [ crossV(x) for x in clf ]

df = pd.concat( cross_clf )

编辑:

这是对你评论中问题的一个例子:

我需要 i = clf_nb 或者 i = clf_nb 来开始 while 循环

hhh = [clf_nb, clf_dt]

g = pd.DataFrame()

i = clf_nb

while i in hhh: # if `clf_nb` is still on the list `hhh` then ...
    g.append( crossV(i) ) # append `clf_nb` to the `g`

但是 i 一直等于 clf_nb,而且 clf_nb 一直在列表 hhh 中,所以你会陷入一个无限循环,总是把 clf_nb 加到 g

撰写回答