根据条件更改列的符号

时间:2019-01-10 15:36:59

标签: python pandas dataframe

输入DF:

value1, value2
123L, 20
222S, 10
222L, 18

我想用value2中的value1来表示L字母为负的值,所以我试图将它们乘以-1

扩展结果:

value1, value2
    123L, -20
    222S, 10
    222L, -18

我的代码

if np.where(DF['value1'].str.contains('L', case=False)):
    DF['value2'] = DF['value2'] * -1

但是在输出中,我正在接收value2列中的所有否定值。 如何仅对选定的行实施此条件? 谢谢

3 个答案:

答案 0 :(得分:2)

您可以对loc使用布尔索引:

df.loc[df['value1'].str[-1] == 'L', 'value2'] *= -1

或者,使用pd.Series.mask

df['value2'].mask(df['value1'].str[-1] == 'L', -df['value2'], inplace=True)

如果您热衷于使用np.where,可以这样做,但很冗长:

df['value2'] = np.where(df['value1'].str[-1] == 'L', -df['value2'], df['value2'])

通知np.where已被矢量化,您不应将其与if结合使用。

答案 1 :(得分:1)

str.endswith + loc

df.loc[[x.endswith('L') for x in df.value1], 'value2'] *= -1
df

  value1  value2
0   123L     -20
1   222S      10
2   222L     -18

mask

df['value2'] = df.value2.mask(df.value1.str.endswith('L'), -df.value2)
df

  value1  value2
0   123L     -20
1   222S      10
2   222L     -18

答案 2 :(得分:1)

replace more info的入侵

df.value1.replace({'L':-1,'S':1},regex=True)*df.value2.astype(int)
Out[183]: 
0   -20
1    10
2   -18
dtype: int64

-

重新分配

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