2017-06-12 39 views
1

我擁有張量流多類預測的結果,並且我已經能夠獲得每行和其相應列標題的最高值(這是最有可能預測的類別)追加到原始數據進行進一步分析,如下所示:如何獲得前n個值和相應的列標題以追加到熊貓數據框中

與預測賠率有關的原始結果df看起來有點像以下,但有260列。列標題是整數..可能性是行0,1等數以百萬計的第一排..

0 1 2 3 4 5 6 7 8 9 10 11 ....... 259 
0 8.840584e-08 0.000115 0.000210 0.001662 0.002789  
1 0.000312 0.000549 0.002412 0.000630 0.000077  

是努力獲得最高值(包含行)的代碼是:

eval_datan['odds']=predsdf.max(axis=1) #gets the largest value in the row 

而得到相應的列標題,並追加到原來的DF:

eval_datan['pred']=predsdf.idxmax(axis=1) #gets the column header for the largest value 

我無法弄清楚如何讓這種情況下,頂部的「n」的前5名,也許並將它們添加到原始DF

結果目前的樣子:

agegrp gender race marital_status region ccs1 ccs2 ccs3 ccs4 ccs5 odds pred 
0 272 284 298 288 307 101 164 53 98 200 0.066987 102 
1 272 285 300 290 307 204 120 147 258 151 0.196983 47 
2 272 284 298 289 307 197 2 39 253 259 0.109894 259 

所以,我要的是前5 preds前5位的賠率......對原始數據的結尾。

我看過nlargest熊貓,但到目前爲止沒有運氣?

回答

1

您可以通過更改下面的變量n來選擇您的前N個特徵。

import pandas as pd 

df = pd.read_table('your_sample_data.txt', delimiter='\s+') 

n=3 # Top N features 
frames = [] 

df.T.apply(lambda x: frames.append(x.sort_values(ascending=False).head(n).index.tolist()), axis=0) 

print(df) 
print(df.join(pd.DataFrame(frames, columns=['ccs{}'.format(n+1) for n in range(n)]))) 


       0   1   2   3   4 
0 8.840584e-08 0.000115 0.000210 0.001662 0.002789 
1 3.120000e-04 0.000549 0.002412 0.000630 0.000077 

       0   1   2   3   4 ccs1 ccs2 ccs3 
0 8.840584e-08 0.000115 0.000210 0.001662 0.002789 4 3 2 
1 3.120000e-04 0.000549 0.002412 0.000630 0.000077 2 3 1 
+0

看起來不錯!我會放棄它,看起來可能會很慢,但至少它應該完成工作,希望可能有一些更好的功能,類似於我原來的樣子。所以我會離開',直到我有機會在上午覈實!謝謝。 – dartdog

+1

我同意會有更優雅的方式。但就速度而言,與未知功能相比,它不會那麼糟糕。因爲它取決於特徵的數量而不是記錄或這種情況下的每個值。 '.apply(axis = 0)'方法應該在你的情況下只迭代260次(仍然每個260個向量將被處理爲一個向量)。我會留下這個評論,因爲他們故意在誤解的基礎上避開這種方法。 – su79eu7k

+0

非常感謝,澄清我不得不修改如下,以獲得列標題和值添加到結果「eval_datan」n = 5#前N個功能 frames = [] framesv = [] predsdf.T .apply(lambda x:frames.append(x.sort_values(ascending = False).head(n).index.tolist()),axis = 0) predsdf.T.apply(lambda x:framesv.append(x .sort_values(ascending = False).head(n).tolist()),axis = 0) 和: eval_datan = eval_datan.join(pd.DataFrame(frames,columns = ['ccsp {}'.format(n +1)for n in range(n)])) eval_datan = eval_datan.join(pv.DataFrame(framesv,columns = ['oddsp {}'.format(n + 1)for n in range(n)])) ) – dartdog

相關問題