Изменить знак столбца в зависимости от условия - PullRequest
0 голосов
/ 10 января 2019

входной 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 голосов
/ 10 января 2019

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
0 голосов
/ 10 января 2019

Взлом от replace подробнее

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
0 голосов
/ 10 января 2019

Вы можете использовать логическое индексирование с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...