簡體   English   中英

如何使用 pandas dataframe 獲取最大值和相應的列名

[英]How to get max value AND respective column name with pandas dataframe

我有一個看起來像這樣的 df,但有更多的列

Item      Raw    Juice   Jelly
Apples     2       5       3
Grapes     1       3       4
Bananas    7       3       5

到目前為止,我正在嘗試創建兩個新列,一個具有最高價值,一個具有各自的 uh... 形式? 對不起,如果我沒有使用正確的話。 無論如何,它最終會看起來像這樣:

Item      Raw    Juice   Jelly   HighestValue   Form
Apples     2       5       3           5        Juice
Grapes     1       3       4           4        Jelly
Bananas    7       3       5           7        Raw

目標是找出每種水果更貴的方式,這樣我以后就可以輕松獲得最昂貴的水果,它的價格和形狀。

print(f'The most expensive fruit is {fruit}, worth ${price} as {form}.')
> 'The most expensive fruit is bananas, worth $7 as raw.'

我確實使用 argmax 獲得了最大值,但我不知道如何獲得相應的列名。 有一個更好的方法嗎? 它甚至不必是 df 中的新列,但我想不出另一種方法來做到這一點。 提前致謝。

您可以為此使用 lambda function :

data = {
'Item' : ['Apples','Grapes','Bananas'],
'Raw' : [20,1,7],
'Juice':[5,30,3],
'Jelly' : [5,4,70]
}

df = pd.DataFrame(data)

df['HighestValue'] = df.apply(lambda row: max(row[1:].tolist()) , axis = 1 )
df['Form'] = df.apply(lambda row: 
df.columns[row.tolist().index(max(row[1:-1].tolist()))] , axis = 1 )
df

#Output:

    Item    Raw Juice   Jelly   HighestValue    Form
0   Apples  20  5       5       20              Raw
1   Grapes  1   30      4       30              Juice
2   Bananas 7   3       70      70              Jelly

注意:為避免類型錯誤,您可以 select 僅數值:

df_num = df._get_numeric_data() # will bring all numeric columns
df_str = df.select_dtypes(include='object') #will bring all string columns

df_num['HighestValue'] = df_num.apply(lambda row: max(row.tolist()) , axis = 1 )
df_num['Form'] = df_num.apply(lambda row: 
df_num.columns[row.tolist().index(max(row.tolist()))] , axis = 1 )

然后你可以結合你的 df_num 和 df_str 數據框:

df_combined = pd.concat([df_str , df_num], axis=1) 

這是解決方案:

import pandas as pd
import numpy as np

data = {'Item': {0: 'Apples', 1: 'Grapes', 2: 'Bananas'},
        'Raw': {0: 2, 1: 1, 2: 7},
        'Juice': {0: 5, 1: 3, 2: 3},
        'Jelly': {0: 3, 1: 4, 2: 5}}
df = pd.DataFrame(data)

df['Higest Value'] = df.apply(lambda x: max([x['Raw'], x['Juice'], x['Jelly']]), axis=1)
df['Form'] = df.apply(lambda x: ['Raw', 'Juice', 'Jelly'][np.argmax([x['Raw'], x['Juice'], x['Jelly']])], axis = 1)

print(df)
#output:
      Item  Raw  Juice  Jelly  Higest Value   Form
0   Apples    2      5      3             5  Juice
1   Grapes    1      3      4             4  Jelly
2  Bananas    7      3      5             7    Raw

對於可以推廣到更多列的解決方案,請使用切片:

df['Higest Value'] = df.apply(lambda x: max(x[1:4]), axis=1)
df['Form'] = df.apply(lambda x: df.columns[1:4][np.argmax(x[1:4])], axis = 1)

這應該有效:

df.assign(Largestvalue = df.iloc[:,1:].max(axis=1),Form = df.iloc[:,1:].idxmax(axis=1))

暫無
暫無

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

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