'pandas copy value from one column to another if condition is met

I have a dataframe:

df = 
col1  col2  col3 
1      2     3
1      4     6
3      7     2

I want to edit df, such that when the value of col1 is smaller than 2 , take the value from col3.

So I will get:

new_df = 
col1  col2  col3 
3      2     3
6      4     6
3      7     2

I tried to use assign and df.loc but it didn't work.

What is the best way to do so?



Solution 1:[1]

df['col1'] = df.apply(lambda x: x['col3'] if x['col1'] < x['col2'] else x['col1'], axis=1)

Solution 2:[2]

The most eficient way is by using the loc operator:

mask = df["col1"] < df["col2"]
df.loc[mask, "col1"] = df.loc[mask, "col3"]

Solution 3:[3]

df.loc[df["col1"] < 2, "col1"] = df["col3"]

Solution 4:[4]

As mentioned by @anky_91 use np.where to update the 'col1' values:

df['col1'] = np.where(df['col1'] < df['col2'], df['col3'], df['col1'])

Solution 5:[5]

You could look at using the apply function.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

df['col1'] = df.apply(lambda c: c['col3'] if c['col1'] < 2 else c['col1'], axis=1)

Edit: Sorry, I see from your mock outcome you are referring to col2 rather than an int of 2. Eric Yang's answer will solve your problem.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 mkk
Solution 4
Solution 5