2014-07-18 29 views
0

我的問題是for循環的每一步,都會生成一個新的數據幀。我希望將數據幀Concat的在一起有一個較大的一個,但不知何故我的函數將只返回結果的最後一個步驟,而不是合併的結果用於循環以將數據幀連接到較大的數據幀

def crossV(clf,data,n): 
    cvResult=pd.DataFrame() 
    for i in range(n+2)[2:]: 
     cvResult=pd.DataFrame() 
     tt=array(tuple(x[1:i] for x in data)) 
     qq=array(tuple(x[0] for x in data)) 
     recall_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='recall')*100 
     precision_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='precision')*100 
     accuracy_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='accuracy')*100 
     index_i=Series(np.repeat(i-1,10)) 
     classifier_i=Series(np.repeat(str(clf)[:7],10)) 
     recall_rate=Series(recall_rate) 
     precision_rate=Series(precision_rate) 
     accuracy_rate=Series(accuracy_rate) 
     rate={"classfier":classifier_i,"model":index_i,"recall":recall_rate,"precision":precision_rate,"accuracy":accuracy_rate} 
     result=pd.concat(rate,axis=1) 
    cvResult=cvResult.append(result) 
    return(cvResult) 

謝謝!

+1

也許結果= pd.concat([result,rate],ignore_index = True)?? –

+0

順便說一句:在'='和''後面加'spaces',使代碼更具可讀性 - 參見:[PEP 8 - Python代碼樣式指南](http://legacy.python.org/dev/peps/ pep-0008 /) – furas

+0

@fasttooth不幸的是它不起作用:( – MYjx

回答

1

這可能不是正確的答案,它的答案更具可讀性。

我認爲正確的邏輯應該(但我可以非常錯誤的):

def crossV(clf,data,n): 
    cvResult=pd.DataFrame() #create an empty DF here. 
    for i in range(n+2)[2:]: 
     # cvResult=pd.DataFrame() -- remove this line. 
     tt=array(tuple(x[1:i] for x in data)) 
     qq=array(tuple(x[0] for x in data)) 
     recall_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='recall')*100 
     precision_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='precision')*100 
     accuracy_rate=cross_validation.cross_val_score(clf, tt, qq, cv=10,scoring='accuracy')*100 
     index_i=Series(np.repeat(i-1,10)) 
     classifier_i=Series(np.repeat(str(clf)[:7],10)) 
     recall_rate=Series(recall_rate) 
     precision_rate=Series(precision_rate) 
     accuracy_rate=Series(accuracy_rate) 
     rate={"classfier":classifier_i,"model":index_i,"recall":recall_rate,"precision":precision_rate,"accuracy":accuracy_rate} 
     # result=pd.concat(rate,axis=1) --remove this line as well. 
     # I think you don't need the "result" variable. 

     # move this line inside and make a little change: 
     #cvResult=cvResult.append(result) 
     cvResult = pd.concat([cvResult, rate], ignore_index=True) 
    return(cvResult) 

能否請您試試這個,讓我們知道,如果它的工作原理? 我認爲你的問題之一是你使用pd.concat(obj)的方式,obj應該是pd.Series的一個項目列表或字典...... 但你沒有與其他任何東西一致。 和變量「結果」的使用對我來說是不必要的。 但是,我可能錯了。

+0

我同意 - '結果' ''cvResult'應該用來代替'result' – furas

+0

它仍然不起作用錯誤是「不能連接非NDFrame對象」,但thx @fasttooth :) – MYjx

+0

哦,你需要做rate = pd .DataFrame({「classfier」:classifier_i,「model」:index_i,「recall」:recall_rate,「precision」:precision_rate,「accuracy」:accuracy_rate})在連接之前將其設置爲DataFrame。 –