如何使用for循环附加python中函数生成的数据帧

如何使用for循环附加python中函数生成的数据帧,python,pandas,append,scikit-learn,Python,Pandas,Append,Scikit Learn,我的问题是,我生成了一个函数来存储每个分类器中每个逐步模型的10倍交叉验证分数。例如,对于NaiveBayes,我有两个模型,一个只使用一个变量,而另一个使用两个。该模型类似于决策树模型。函数类似于 def crossV(clf): cvOutcome=pd.DataFrame() index=pd.DataFrame() classifier=pd.DataFrame() for i in range(4)[2:]: tt=array(tuple

我的问题是,我生成了一个函数来存储每个分类器中每个逐步模型的10倍交叉验证分数。例如,对于NaiveBayes,我有两个模型,一个只使用一个变量,而另一个使用两个。该模型类似于决策树模型。函数类似于

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)) 
它可以工作,但只是给我一个更大的列表,我不知道如何将其转换为数据帧

clf = [clf_nb, clf_dt]

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

df = pd.concat( cross_clf )

编辑:

评论中的问题示例:

我需要
I=clf\u nb
I=clf\u nb

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
g

我尝试过的可能重复,但结果是什么,我不知道出了什么问题,你尝试过吗(clf_nb),crossV(clf_dt)))
这段代码有效,但如果我有20个分类器呢?我想写一个通用函数来实现这一点,但不知怎么的,它对我不起作用…谢谢!它有效!!!但是你能指出while循环在这里不起作用的原因吗?再次感谢!
而我在hhh
中的意思是:如果列表中存在
I
中的值
hhh
重复。如果我在hhh中,这就像是
。谢谢!但是当
i
hhh
中时,我仍然有点困惑,为什么它没有像你的代码那样做concat或append?再次感谢!:@furasf首先你没有变量
i
,其次
i
必须是
i=clf\nb
i=clf\dt
for
中的第三个
中的
的工作方式不同,而
if
的工作方式不同<代码>在<代码>中<代码>而<代码>只勾选“如果'i'仍然在列表'hhh'中,那么…”,<代码>在<代码>中<代码>对于<代码>请执行`从'hhh'获取下一个元素并将其分配给'i',然后…”我添加了一些示例来回答。