Python 如何获取要附加到数据帧的前n个值和相应的列标题

Python 如何获取要附加到数据帧的前n个值和相应的列标题,python,pandas,numpy,Python,Pandas,Numpy,我有一个tensorflow多类预测的结果,我能够得到每一行的顶部值及其相应的列标题(这是最有可能的预测类),以便附加到原始数据中进行进一步分析,如: 原始结果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.00278

我有一个tensorflow多类预测的结果,我能够得到每一行的顶部值及其相应的列标题(这是最有可能的预测类),以便附加到原始数据中进行进一步分析,如:

原始结果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    
用于获取最大值(包含在行中)的代码是:

并获取相应的列标题并将其附加到原始DF:

eval_datan['pred']=predsdf.idxmax(axis=1) #gets the column header for the largest value
我不知道如何在这种情况下获得前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名pred和前5名赔率


我已经查看了熊猫中的NLAGEST,但到目前为止没有运气?

您可以通过更改下面的变量
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

看起来不错!我会试一试,虽然看起来可能会慢一些,但至少它应该能完成任务,我希望可能会有一些更好的功能,类似于我原来做的。所以我会一直开着,直到我有机会在am中验证!谢谢。我同意会有更优雅的方式。但就速度而言,与我未知的功能相比,它不会那么差。因为在这种情况下,它取决于未记录的特征数或每个值
.apply(axis=0)
方法在您的情况下应该只迭代260次(仍然每个260个向量将作为一个向量处理)。出于误解,我将为有意避开该方法的人留下此评论。非常感谢,为了澄清,我不得不修改如下内容,以获得列标题和添加到结果“eval_datan”n=5#Top n features frames=[]framesv=[]predsdf.T.apply(lambda x:frames.append(x.sort\u values(升序=False).head(n).index.tolist()、axis=0)predsdf.T.apply(lambda x:framesv.append(x.sort_值(升序=False).head(n.tolist()、axis=0)和:eval_datan=eval_datan.join(pd.DataFrame(frames,columns=['ccsp{}.format(n+1)表示范围(n)])中的n)eval_datan=eval_datan.join(pd.DataFrame(framesv,columns=['oddsp{.1)表示范围(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