输入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
列中的所有否定值。
如何仅对选定的行实施此条件?
谢谢
答案 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