I wanted to create a "High Value Indicator" column, which says "Y" or "N" based on two different value columns. I want the new column to have a "Y" when Value_1 is > 1,000 or Value_2 > 15,000. Bellow is the table, the desired output would include the indicator column based on the or condition about.
ID Value_1 Value_2
1 100 2500
2 250 6250
3 625 15625
4 1500 37500
5 3750 93750
Try using .loc and .fillna
df.loc[((df['Value_1'] > 1000)
|(df['Value_2'] > 15000)), 'High_Value_Ind'] = 'Y'
df['High_Value_Ind'] = df['High_Value_Ind'].fillna('N')
Use numpy.where
with chained conditions by |
for or
:
df['High Value Indicator'] = np.where((df.Value_1 > 1000) | (df.Value_2 > 15000), 'Y', 'N')
Or map
by dictionary
:
df['High Value Indicator'] = ((df.Value_1 > 1000) | (df.Value_2 > 15000))
.map({True:'Y', False:'N'})
print (df)
ID Value_1 Value_2 High Value Indicator
0 1 100 2500 N
1 2 250 6250 N
2 3 625 15625 Y
3 4 1500 37500 Y
4 5 3750 93750 Y
Timings:
df = pd.concat([df] * 10000, ignore_index=True)
In [76]: %timeit df['High Value Indicator1'] = np.where((df.Value_1 > 1000) | (df.Value_2 > 15000), 'Y', 'N')
100 loops, best of 3: 4.03 ms per loop
In [77]: %timeit df['High Value Indicator2'] = ((df.Value_1 > 1000) | (df.Value_2 > 15000)).map({True:'Y', False:'N'})
100 loops, best of 3: 4.82 ms per loop
In [78]: %%timeit
...: df.loc[((df['Value_1'] > 1000)
...: |(df['Value_2'] > 15000)), 'High_Value_Ind3'] = 'Y'
...:
...: df['High_Value_Ind3'] = df['High_Value_Ind3'].fillna('N')
...:
100 loops, best of 3: 5.28 ms per loop
In [79]: %timeit df['High Value Indicator'] = (df.apply(lambda x: 'Y' if (x.Value_1>1000 or x.Value_2>15000) else 'N', axis=1))
1 loop, best of 3: 1.72 s per loop
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With