簡體   English   中英

在 Python 中查找第 2 和第 3 大值

[英]Find 2nd and 3rd highest value in Python

我有以下食品及其營養成分的數據框如下:

import pandas as pd
import os
os.chdir('D:\\userdata\\adbharga\\Desktop\\AVA\\RTestCode\\Python')
data=pd.read_csv("nutrient.csv")
data.head()

出[30]:

Name  Calories  Fat  Carb  Fiber  Protein
0      Chonga Bagel       300    5    50      3       12
1      8-Grain Roll       380    6    70      7       10
2  Almond Croissant       410   22    45      3       10
3     Apple Fritter       460   23    56      2        7
4  Banana Nut Bread       420   22    52      2        6

需要提取 Top Nutrient 的含量及其價值。 對於下面使用的代碼。

data['Top Nutrient'] = data[['Calories','Fat','Carb','Fiber','Protein']].idxmax(axis=1)
data['Amount']= data[['Calories','Fat','Carb','Fiber','Protein']].max(axis=1)
data.head()

出[33]:

Name  Calories  Fat  Carb  Fiber  Protein Top Nutrient  Amount
0      Chonga Bagel       300    5    50      3       12     Calories     300
1      8-Grain Roll       380    6    70      7       10     Calories     380
2  Almond Croissant       410   22    45      3       10     Calories     410
3     Apple Fritter       460   23    56      2        7     Calories     460
4  Banana Nut Bread       420   22    52      2        6     Calories     420

有沒有辦法顯示接下來的 2 種頂級營養素及其 Value.Expected Output 將是這樣的:

Name    NextTop2   NextTop2Amount
Chonga Bagel        Carb|Protein    50|12
8-Grain Roll        Carb|Protein    70|10
Almond Croissant    Carb|Fat        45|22
Apple Fritter       Carb|Fat        56|23
Banana Nut Bread    Carb|Fat        52|22

謝謝

這是最好的使用numpy.argsort因為非常快。

首先按subset過濾列 - []並通過argsort獲取 2. 和 3. 頂部的索引:

cols = ['Calories','Fat','Carb','Fiber','Protein']

arr = data[cols].values.argsort(axis=1)[:, [-2, -3]]
a = np.array(cols)[arr]
print (a)
[['Carb' 'Protein']
 ['Carb' 'Protein']
 ['Carb' 'Fat']
 ['Carb' 'Fat']
 ['Carb' 'Fat']]

還可以按索引選擇值:

b = data[cols].values[np.arange(len(arr))[:,None], arr]
print (b)
[[50 12]
 [70 10]
 [45 22]
 [56 23]
 [52 22]]

最后創建DataFrame並添加 join by | 對於一列:

data['Top Nutrient'] = data[cols].idxmax(axis=1)
data['Amount']= data[cols].max(axis=1)
data['NextTop2'] = pd.DataFrame(a).apply('|'.join, 1)
data['NextTop2Amount'] = pd.DataFrame(b).astype(str).apply('|'.join, 1)

print (data)

               Name  Calories  Fat  Carb  Fiber  Protein Top Nutrient  Amount  \
0      Chonga Bagel       300    5    50      3       12     Calories     300   
1      8-Grain Roll       380    6    70      7       10     Calories     380   
2  Almond Croissant       410   22    45      3       10     Calories     410   
3     Apple Fritter       460   23    56      2        7     Calories     460   
4  Banana Nut Bread       420   22    52      2        6     Calories     420   

       NextTop2 NextTop2Amount  
0  Carb|Protein          50|12  
1  Carb|Protein          70|10  
2      Carb|Fat          45|22  
3      Carb|Fat          56|23  
4      Carb|Fat          52|22  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM