применить расширенную логику для генерации нового pandas кадра данных - PullRequest
0 голосов
/ 30 марта 2020

В Python 3 pandas фрейме данных

a,b
100000,NaN
100000,NaN
100000,NaN
100000,500
10000,5000

Я хотел бы создать новый столбец C на основе следующих логик c:

def applyFunc(a,b):

    if a >= 25000 & b is not null:
        return b*0.3
    elif a >= 25000 & b is null:
        return a*0.3
    else:
        return 0

обратите внимание, что столбцы a и b являются числами с плавающей запятой, но могут иметь значение null.

идеальный вывод:

a,b,c
100000,NaN,30000
100000,NaN,30000
100000,NaN,30000
100000,50000,15000
10000,5000,0

Я пробовал следующее:

df['c']=df.apply(lambda x:applyFunc(df['a'],df['b']), axis=1)

ошибка :

TypeError: ('cannot compare a dtyped [float64] array with a scalar of type [bool]', 'occurred at index 0')

Есть мысли? Спасибо!

Ответы [ 2 ]

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

Используйте numpy.select с проверкой ошибочных значений по Series.isna и Series.notna:

m1 = (df.a >= 25000) & (df.b.notna())
m2 = (df.a >= 25000) & (df.b.isna())

df['c'] = np.select([m1, m2], [df.b*0.3, df.a*0.3], default=0)
print (df)
        a       b        c
0  100000     NaN  30000.0
1  100000     NaN  30000.0
2  100000     NaN  30000.0
3  100000   500.0    150.0
4   10000  5000.0      0.0
0 голосов
/ 30 марта 2020

Ошибка в вашем коде:

a >= 25000 & b is not null

Вы используете битовое соединение & вместо логического соединения and, следовательно, ошибка типа.

Это должно работать:

a >= 25000 and b is not null 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...