Reputation: 125
I would like to create a new column, based on whether a value between 1 and 5 exists in a row.
This is my df:
In case any of the values in a row is between 0 and 5, I would like the new column to return "Yes". In this case, it's only the row with 3.0.
I've tried something like:
cols=[col for col in df.columns if 'date_' in col]
df['new_col']=df[cols].apply(lambda x: "Yes" if 0<=x[cols]<=5 else "No",axis=0)
but I get this error:
KeyError: "None of [Index(['date_0', 'date_1', 'date_2', 'date_3', 'date_4', 'date_5', 'date_6',\n 'date_7', 'date_8', 'date_9', 'date_10', 'date_11', 'date_12',\n 'date_13', 'date_14', 'date_15', 'date_16', 'date_17', 'date_18',\n 'date_19', 'date_20', 'date_21', 'date_22', 'date_23', 'date_24',\n 'date_25', 'date_26', 'date_27', 'date_28', 'date_29', 'date_30',\n 'date_31', 'date_32', 'date_33', 'date_34', 'date_35', 'date_36',\n 'date_37', 'date_38', 'date_39', 'date_40', 'date_41', 'date_42',\n 'date_43', 'date_44', 'date_45', 'date_46', 'date_47', 'date_48',\n 'date_49', 'date_50', 'date_51', 'date_52', 'date_53', 'date_54',\n 'date_55', 'date_56', 'date_57', 'date_58', 'date_59', 'date_60',\n 'date_61', 'date_62', 'date_63', 'date_64', 'date_65', 'date_66',\n 'date_67', 'date_68', 'date_69', 'date_70', 'date_71', 'date_72',\n 'date_73', 'date_74', 'date_75', 'date_76', 'date_77', 'date_78'],\n dtype='object')] are in the [index]"
Upvotes: 1
Views: 50
Reputation: 863501
Use DataFrame.filter
for date_
columns, compare by DataFrame.le
and
DataFrame.ge
for between values, chain by &
for bitwise AND
with DataFrame.any
for teste at least one True
per row and set Yes/No
in numpy.where
:
print (df)
date_1 date_2
0 9 -3
1 3 9
2 -7 -1
3 4 0
df1 = df.filter(like='date_')
df['new_col'] = np.where((df1.ge(0) & df1.le(5)).any(axis=1), "Yes", "No")
print (df)
date_1 date_2 new_col
0 9 -3 No
1 3 9 Yes
2 -7 -1 No
3 4 0 Yes
Upvotes: 1