Другой подход:
df = pd.DataFrame({'X_1' : ['IEZ', 'PXJ', 'ABC', 'XOP'],
'X_2' : ['XOP', 'ABC', 'RYE', 'IEZ'],
'X_3' : ['ABC', 'XES','PXE', 'ABC'],
'W_1' : [0.42, 0.47, 0.23, 0.62],
'W_2' : [0.18, 0.12, 0.33, 0.20],
'W_3' : [0.40, 0.41, 0.44, 0.18]})
Сначала возьмите числовые столбцы:
num_columns = df.loc[:,'W_1':'W_3']
Затем сгенерируйте логическую маску, используя X_1
-> X_3
столбцы:
df_mask = (df.loc[:,'X_1':'X_3']=='ABC').values
Наконец, используйте метод маски DataFrame, который будет возвращать NaN, когда ячейка имеет значение True, и значение ячейки, когда маска имеет значение False.Затем мы суммируем результирующие строки и присвоим их исходному кадру данных:
df['W'] = num_columns.mask(~df_mask).sum(axis=1)
Конечно, это можно объединить в одну строку:
df['W'] = (df.loc[:,'W_1':'W_3']
.mask(~(df.loc[:,'X_1':'X_3']=='ABC').values)
.sum(axis=1))
Редактировать:
Конечно, это будет работать только при наличии только одного экземпляра 'ABC'
на строку - вы можете запустить проверку для этого.