Pandas датафрейм вычитает значения из двух столбцов в одном и том же кадре на основе условия? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть df с колонками name, a, b. Если столбец b имеет значение -ve, вычтите его из столбца a. Вычитайте значение из столбца a только если столбец b имеет значение -ve.

df
        name        a       b
0       anthony    10       5
1       marcus     75      -50
2       paul      100      -100
3       Aaron     200       7

Ожидаемый результат:

        name        a       b
0       anthony    10       5
1       marcus     25       0
2       paul        0       0
3       Aaron     200       7

Пример данных:

import pandas as pd
from io import StringIO

s = '''\
name,a,b
anthony,10,5
marcus,75,-50
paul,100,-100
Aaron,200,7
'''
df = pd.read_csv(StringIO(s))

Ответы [ 4 ]

3 голосов
/ 28 марта 2020

Попробуйте использовать df.clip

df['a'] = df.a + df.b.clip(upper=0)
df['b'] =  df.b.clip(lower=0)

Out[11]:
      name    a  b
0  anthony   10  5
1   marcus   25  0
2     paul    0  0
3    Aaron  200  7
1 голос
/ 28 марта 2020

Просто спросите об этом:

df.loc[df['b'] < 0, 'a'] = df['a'] + df['b']
df.loc[df['b'] < 0, 'b'] = 0

Дает, как и ожидалось:

      name    a  b
0  anthony   10  5
1   marcus   25  0
2     paul    0  0
3    Aaron  200  7
1 голос
/ 28 марта 2020

Вы можете использовать логическую маску:

b_neg = (df['b']<0)
df['a'] = df['a'] + b_neg * df['b']
df['b'] = (1-b_neg) * df['b']

df
      name    a  b
0  anthony   10  5
1   marcus   25  0
2     paul    0  0
3    Aaron  200  7
0 голосов
/ 28 марта 2020

Не очень элегантно, но выньте интересующий вас столбец как серию, выполните любую фильтрацию и добавьте его в кадр данных

s = df['b']
s[s > 0] = 0
df['a'] = df['a']  + s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...