Может быть другое эффективное решение, может быть, вы можете попробовать использовать следующее, где, если col1
равно s
, тогда возвращается s
, иначе применяется np.where
с другим условием:
df['col1'] = np.where((df['col1'] == 's'), 's',
np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) &
(df['col3'].str.contains('f',case = False,regex=True,na=False)),
'z','x')
)
print(df)
Результат:
col1 col2 col3
0 s b c
1 z e f
2 x h i
Обновление:
Для большего условия все еще с where
:
df['col1'] = np.where((df['col1'] == 's'), 's',
np.where((df['col1'] == 'z'), 'z',
np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) &
(df['col3'].str.contains('f',case = False,regex=True,na=False)),
'z','x')
)
)
print(df)
Использование apply:
Сначала мы можем создать функцию, а затем применить к dataframe
:
def function(row):
if row['col1'] == 's':
return 's'
elif row['col1'] == 'z':
return 'z'
elif ('e' in row['col2'].lower()) and 'f' in row['col3'].lower():
return 'z'
else:
return 'x'
Теперь примените функцию к фрейму данных:
df['col1'] = df.apply(function, axis=1)
print(df)
Результат:
col1 col2 col3
0 s b c
1 z e f
2 x h i