Create new column in DataFrame based on respective values in two different columns

Viewed 80

I have the following dataframe:

cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','No Brand'],
        'Country': ['Japan','No Country','United States','Germany']
        }

df = pd.DataFrame(cars, columns = ['Brand', 'Country'])
df.head(4)

            Brand        Country
0     Honda Civic          Japan
1  Toyota Corolla     No Country
2      Ford Focus  United States
3        No Brand        Germany

Would like to create a new column in the dataframe which will combine based on the values of column 'Brand' and 'Country'. If there is 'No Brand' value in column Brand then column Desc only takes the value in column Country. If there is 'No Country' value in column Country then column Desc only takes the value in column Brand. Desired output:

            Brand        Country    Desc
0     Honda Civic          Japan    Honda Civic Japan
1  Toyota Corolla     No Country    Toyota Corolla
2      Ford Focus  United States    Ford Focus United States
3        No Brand        Germany    Germany

If it is checking the string in one column, I am able to do so but not sure how to proceed for two columns. Right now I can only check the boolean on the condition I want.

df['Desc'] = df['Brand'].str.contains("No Brand") | df['Country'].str.contains("No Country")

            Brand        Country    Desc
0     Honda Civic          Japan    False
1  Toyota Corolla     No Country    True
2      Ford Focus  United States    False
3        No Brand        Germany    True

I read that it is not recommended to iterate dataframe and avoid doing so.

3 Answers

Let's concat both the columns then use str.replace to replace the No Brand and No Country values with empty string:

df['Desc'] = (df['Brand'] + ' ' + df['Country']).str.replace(r'No Brand\s*|\s*No Country', '')

Result:

            Brand        Country                      Desc
0     Honda Civic          Japan         Honda Civic Japan
1  Toyota Corolla     No Country            Toyota Corolla
2      Ford Focus  United States  Ford Focus United States
3        No Brand        Germany                   Germany
def get_desc(brand, country):
    return (brand if brand != 'No Brand' else '') +\
           (' ' + country if country != 'No Country' else '')


df['Desc'] = df['Brand'].combine(df['Country'], get_desc)

print(df.head(4))

Output:

            Brand        Country                      Desc
0     Honda Civic          Japan         Honda Civic Japan
1  Toyota Corolla     No Country            Toyota Corolla
2      Ford Focus  United States  Ford Focus United States
3        No Brand        Germany                   Germany
In [2]: cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','No Brand'],
   ...:         'Country': ['Japan','No Country','United States','Germany']
   ...:         }
   ...: 
   ...: df = pd.DataFrame(cars, columns = ['Brand', 'Country'])
   ...: df
Out[2]: 
            Brand        Country
0     Honda Civic          Japan
1  Toyota Corolla     No Country
2      Ford Focus  United States
3        No Brand        Germany

In [3]: df['New_col'] = (df.Brand + " " + df.Country).str.replace("No Brand", "").str.replace("No Country", "").str.strip()

In [4]: df
Out[4]: 
            Brand        Country                   New_col
0     Honda Civic          Japan         Honda Civic Japan
1  Toyota Corolla     No Country            Toyota Corolla
2      Ford Focus  United States  Ford Focus United States
3        No Brand        Germany                   Germany

Related