pandas create new column based on values from other columns

I've tried different methods from other q but still can't seem to find the right answer for my problem. The critical piece of this is that if the person is counted as Hispanic they can't be counted as anything else. Even if they have a "1" in another ethnicity column they still are counted as Hispanic not a two or more races. Similarly, if the sum of all the ERI columns is greater than 1 they are counted as two or more races and can't be counted as a unique ethnicity(accept for Hispanic). Hopefully this makes sense. Any help will be greatly appreciated.

Its almost like doing a for loop through each row and if each record meets a criteria they are added to one list and eliminated from the original.

From the dataframe below I need to calculate a new column based off of the following:

========================= CRITERIA ===============================

    IF [ERI_Hispanic] = 1 THEN RETURN Hispanic
    ELSE IF SUM([ERI_AmerInd_AKNatv] + [ERI_Asian] + [ERI_Black_Afr.Amer] + [ERI_HI_PacIsl] + [ERI_White]) > 1 THEN RETURN Two or More
    ELSE IF [ERI_AmerInd_AKNatv] = 1 THEN RETURN A/I AK Native
    ELSE IF [ERI_Asian] = 1 THEN RETURN Asian
    ELSE IF [ERI_Black_Afr.Amer] = 1 THEN RETURN Black/AA
    ELSE IF [ERI_HI_PacIsl] = 1 THEN RETURN Haw/Pac Isl.
    ELSE IF [ERI_White] = 1 THEN RETURN White

Comment: If the ERI Flag for Hispanic is True (1), then employee is classified as “Hispanic”

Comment: If more than 1 non-Hispanic ERI Flag are true, return “Two or More”

====================== DATAFRAME ===========================

         lname          fname       rno_cd  eri_afr_amer    eri_asian   eri_hawaiian    eri_hispanic    eri_nat_amer    eri_white   rno_defined
    0    MOST           JEFF        E       0               0           0               0               0               1           White
    1    CRUISE         TOM         E       0               0           0               1               0               0           White
    2    DEPP           JOHNNY              0               0           0               0               0               1           Unknown
    3    DICAP          LEO                 0               0           0               0               0               1           Unknown
    4    BRANDO         MARLON      E       0               0           0               0               0               0           White
    5    HANKS          TOM         0                       0           0               0               0               1           Unknown
    6    DENIRO         ROBERT      E       0               1           0               0               0               1           White
    7    PACINO         AL          E       0               0           0               0               0               1           White
    8    WILLIAMS       ROBIN       E       0               0           1               0               0               0           White
    9    EASTWOOD       CLINT       E       0               0           0               0               0               1           White

OK, two steps to this - first is to write a function that does the translation you want - I've put an example together based on your pseudo-code:

    def label_race (row):
       if row['eri_hispanic'] == 1 :
          return 'Hispanic'
       if row['eri_afr_amer'] + row['eri_asian'] + row['eri_hawaiian'] + row['eri_nat_amer'] + row['eri_white'] > 1 :
          return 'Two Or More'
       if row['eri_nat_amer'] == 1 :
          return 'A/I AK Native'
       if row['eri_asian'] == 1:
          return 'Asian'
       if row['eri_afr_amer']  == 1:
          return 'Black/AA'
       if row['eri_hawaiian'] == 1:
          return 'Haw/Pac Isl.'
       if row['eri_white'] == 1:
          return 'White'
       return 'Other'

You may want to go over this, but it seems to do the trick - notice that the parameter going into the function is considered to be a Series object labelled "row".

Next, use the apply function in pandas to apply the function - e.g.

    df.apply (lambda row: label_race (row),axis=1)

Note the axis=1 specifier, that means that the application is done at a row, rather than a column level. The results are here:

    0           White
    1        Hispanic
    2           White
    3           White
    4           Other
    5           White
    6     Two Or More
    7           White
    8    Haw/Pac Isl.
    9           White

If you're happy with those results, then run it again, posting the results into a new column in your original dataframe.

    df['race_label'] = df.apply (lambda row: label_race (row),axis=1)

The resultant dataframe looks like this (scroll to the right to see the new column):

          lname   fname rno_cd  eri_afr_amer  eri_asian  eri_hawaiian   eri_hispanic  eri_nat_amer  eri_white rno_defined    race_label
    0      MOST    JEFF      E             0          0             0              0             0          1       White         White
    1    CRUISE     TOM      E             0          0             0              1             0          0       White      Hispanic
    2      DEPP  JOHNNY    NaN             0          0             0              0             0          1     Unknown         White
    3     DICAP     LEO    NaN             0          0             0              0             0          1     Unknown         White
    4    BRANDO  MARLON      E             0          0             0              0             0          0       White         Other
    5     HANKS     TOM    NaN             0          0             0              0             0          1     Unknown         White
    6    DENIRO  ROBERT      E             0          1             0              0             0          1       White   Two Or More
    7    PACINO      AL      E             0          0             0              0             0          1       White         White
    8  WILLIAMS   ROBIN      E             0          0             1              0             0          0       White  Haw/Pac Isl.
    9  EASTWOOD   CLINT      E             0          0             0              0             0          1       White         White

From: stackoverflow.com/q/26886653