У меня есть df, который выглядит примерно так, но с гораздо большим количеством столбцов Предмет Сырой сок Желе Яблоки 2 5 3 Виноград 1 3 4 Бананы 7 3 5 Пока что я ...

0
Alessandra 2 Мар 2021 в 03:37

3 ответа

Лучший ответ

Вот решение:

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)
0
pakpe 2 Мар 2021 в 01:35

Это должно работать:

df.assign(Largestvalue = df.iloc[:,1:].max(axis=1),Form = df.iloc[:,1:].idxmax(axis=1))
0
rhug123 2 Мар 2021 в 01:23

Для этого вы можете использовать лямбда-функцию:

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

Примечание: Чтобы избежать ошибки типа, вы можете выбирать только числовые значения:

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) 
0
Inputvector 2 Мар 2021 в 01:55