2
votes

Changer le signe de la colonne en fonction de la condition

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


0 commentaires

3 Réponses :


2
votes

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 .


0 commentaires

1
votes

str.endswith + loc
df['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

0 commentaires

1
votes

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


0 commentaires