lala345
lala345

Reputation: 125

New column based on values in a row

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:

enter image description here

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

Answers (1)

jezrael
jezrael

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

Related Questions