[英]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.