Vesper
Vesper

Reputation: 845

How to get the max from row's elements in python?

I have a data frame that contains a single column Positive Dispatch,

index Positive Dispatch
  0        a,c
  1         b
  2        a,b

Each keyword has its own value:

a,b,c = 12,22,11

I want to create a new column that contains the max of each row, for example in the first row there are a and c and between them a has the biggest value, which is 12 and so on:

Positive Dispatch  Max
    a,c             12
     b              22
    a,b             22

My attempt:

import pandas as pd
dic1 = {
    'a': [12,0,22],
    'b': [0,13,22],
    'c': [12,0,0], # there can be N number of columns here for example
} # 'd': [11,22,333]

a,b,c = 12,22,11 # d will have its own value, for example d = 33
df = pd.DataFrame(dic1)
df['Positive Dispatch'] = df.gt(0).dot(df.columns + ',').str[:-1] #Creating the positive dispatch column
print(df['Positive Dispatch'].max(axis=1))

But this gives the error:

ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'>

Upvotes: 0

Views: 79

Answers (1)

Anurag Dabas
Anurag Dabas

Reputation: 24304

IIUC:

create a dict then calculate max according to the key and value of the dictionary by using split()+max()+map():

d={'a':a,'b':b,'c':c}
df['Max']=df['Positive Dispatch'].str.split(',').map(lambda x:max([d.get(y) for y in x]))
#for more columns use applymap() in place of map() and logic remains same

OR If you have more columns like 'Dispatch' then use:

d={'a':a,'b':b,'c':c,'d':d}
df[['Max','Min']]=df[['Positive Dispatch','Negative Dispatch']].applymap(lambda x:max([d.get(y) for y in x.split(',')]))

Sample Dataframe used:

dic1 = {
    'a': [12,0,22],
    'b': [0,13,22],
    'c': [12,0,0], # there can be N number of columns here for example
    'd': [11,22,333]}

a,b,c,d = 12,22,11,33 # d will have its own value, for example d = 33
df = pd.DataFrame(dic1)
df['Positive Dispatch'] = df.gt(0).dot(df.columns + ',').str[:-1]
df['Negative Dispatch']=[['a,d'],['c,b,a'],['d,c']]
df['Negative Dispatch']=df['Negative Dispatch'].str.join(',')

output:

    a   b   c   Positive Dispatch   Max
0   12  0   12  a,c                 12
1   0   13  0   b                   22
2   22  22  0   a,b                 22

Upvotes: 2

Related Questions