Эффективные способы присвоения значения на основе условного в Pandas?

#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'])