#python #pandas #conditional-statements
#python #pandas #условные операторы
Вопрос:
Цель состоит в том, чтобы присвоить значение столбцу EXPECTED T
. Значение, которое нужно присвоить, — это C1 S C2 B
если оно есть EM
в столбце C2 B
, иначе значение является изображением значения at C2 B
.
Для реализации цели предлагается следующий код
data = {'C1 S': ['AB','AB','CD','CD','CD'],
'C2 B': ['EM','EM','EM','F','F'],
'EXPECTED_OUTPUT': ['AB EM','EB EM', 'CD EM','F','F']}
df = pd.DataFrame(data)
df['EXPECTED T']=df['C1 S'] ' ' df['C2 B']
mask = df ['C2 B'].str.contains ( r'EM', na=True )
df.loc [~mask, 'EXPECTED T'] = df.loc [~mask, 'C2 B']
Но, интересно, есть ли более питонический способ достижения аналогичного результата, чем приведенный выше код?
Ответ №1:
Используйте numpy.where
или Series.mask
, также возможно использование здесь Series.str.cat
:
mask = df['C2 B'].str.contains ( r'EM', na=True )
df['EXPECTED T'] = np.where(mask, df['C1 S'] ' ' df['C2 B'], df['C2 B'])
#alternative
df['EXPECTED T'] = np.where(mask, df['C1 S'].str.cat( df['C2 B'], sep=' '), df['C2 B'])
print (df)
C1 S C2 B EXPECTED_OUTPUT EXPECTED T
0 AB EM AB EM AB EM
1 AB EM EB EM AB EM
2 CD EM CD EM CD EM
3 CD F F F
4 CD F F F
Или:
mask = df['C2 B'].str.contains ( r'EM', na=True )
df['EXPECTED T'] = df['C2 B'].mask(mask, df['C1 S'] ' ' df['C2 B'])