Antonio
Antonio

Reputation: 71

python pandas dataframes add column depending on values other 2 col

I finally got to a message that I expected could solve my problem. I have two columns in a dataFrame (height, upper) with values either 1 or 0. The combination of this is 4 elements and with them I am trying to create a third column containing the 4 combinations, but I cannot figure out what is going wrong, My code is as follows:

def quad(clasif):
    if (raw['upper']==0 and raw['height']==0):
        return 1
    if (raw['upper']==1 and raw['height']==0):
        return 2
    if (raw['upper']==0 and raw['height']==1):
        return 3
    if (raw['upper']==1 and raw['height']==1):
        return 4

raw['cuatro']=raw.apply(lambda clasif: quad(clasif), axis=1)

I am getting the following error:

'The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index 0'

if someone could help?

Upvotes: 1

Views: 101

Answers (2)

orange
orange

Reputation: 8090

You have to pass the function to apply.

import pandas as pd

def quad(clasif):
    if (clasif['upper']==0 and clasif['height']==0):
        return 1
    if (clasif['upper']==1 and clasif['height']==0):
        return 2
    if (clasif['upper']==0 and clasif['height']==1):
        return 3
    if (clasif['upper']==1 and clasif['height']==1):
        return 4
​
raw = pd.DataFrame({'upper': [0, 0, 1, 1], 'height': [0, 1, 0, 1]})
raw['cuatro']=raw.apply(quad, axis=1)

print raw

height  upper   cuatro
0   0   0   1
1   1   0   3
2   0   1   2
3   1   1   4

Andy Hayden's answer is better suited for your case.

Upvotes: 0

Andy Hayden
Andy Hayden

Reputation: 375755

Assuming that upper and height can only be 0 or 1, you can rewrite this as a simple addition:

raw['cuatro'] = 1 + raw['upper'] + 2 * raw['height']

The reason you see this error is because raw['upper'] == 0 is a Boolean series, which you can't use and... See the "gotcha" section of the docs.

I think you're missing the fundamentals of apply, when passed the Series clasif, your function should do something with clasif (at the moment, the function body makes no mention of it).

Upvotes: 1

Related Questions