input DF:
if np.where(DF['value1'].str.contains('L', case=False)):
DF['value2'] = DF['value2'] * -1
Je veux faire des valeurs dans le volume value2 où dans value1 est L code > lettre négative, j'essaie donc de les multiplier par -1
résultat expiré:
value1, value2
123L, -20
222S, 10
222L, -18
mon code
value1, value2 123L, 20 222S, 10 222L, 18
3 Réponses :
Vous pouvez utiliser l'indexation booléenne avec loc :
df['value2'] = np.where(df['value1'].str[-1] == 'L', -df['value2'], df['value2'])
Vous pouvez également utiliser pd.Series.mask :
df['value2'].mask(df['value1'].str[-1] == 'L', -df['value2'], inplace=True)
Si vous souhaitez utiliser np.where , c'est possible mais détaillé:
df.loc[df['value1'].str[-1] == 'L', 'value2'] *= -1
Remarquez que np.where est déjà vectorisé, vous ne devez pas l'utiliser en conjonction avec si .
str.endswith + locdf['value2'] = df.value2.mask(df.value1.str.endswith('L'), -df.value2)
df
value1 value2
0 123L -20
1 222S 10
2 222L -18
mask df.loc[[x.endswith('L') for x in df.value1], 'value2'] *= -1
df
value1 value2
0 123L -20
1 222S 10
2 222L -18
Le hack de replace en savoir plus
df.value2*=df.value1.replace({'L':-1,'S':1},regex=True)
df
Out[187]:
value1 value2
0 123L -20
1 222S 10
2 222L -18
--
Réattribuez-le
df.value1.replace({'L':-1,'S':1},regex=True)*df.value2.astype(int)
Out[183]:
0 -20
1 10
2 -18
dtype: int64