Numpy TypeError: ufun c 'bitwise_and' не поддерживается для типов ввода, - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий фрейм данных и список значений

import pandas as pd
import numpy as np
df_merge = pd.DataFrame({'column1': ['a', 'c', 'e'],
               'column2': ['b', 'd', 'f'],
               'column3': [0.5, 0.6, .04],
               'column4': [0.7, 0.8, 0.9]
               })

bb = ['b','h']
dd = ['d', 'I']
ff = ['f', 'l']

Я пытаюсь использовать np.where и np.select вместо IF FUNCTION:

condition = [((df_merge['column1'] == 'a') & (df_merge['column2'] == df_merge['column2'].isin(bb))),((df_merge['column1'] == 'c') & (df_merge['column2'] == df_merge['column2'].isin(dd))), ((df_merge['column1'] == 'e') & (df_merge['column2'] == df_merge['column2'].
isin(ff)))]

choices1 = [((np.where(df_merge['column3'] >= 1, 'should not have, ','correct')) & (np.where(df_merge['column4'] >= 0.45, 'should not have, ','correct')))]

df_merge['Reason'] = np.select(condition, choices1, default='correct')

Однако, когда я пытаюсь запустить строку кода из choices1, я получаю следующую ошибку:

TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Я не уверен, что мы можем использовать np.where в вариантах, как указано выше.

np .where должен применяться для обоих столбцов. Ожидаемый результат, как показано ниже:

df_merge = pd.DataFrame({'column1': ['a', 'c', 'e'],
               'column2': ['b', 'd', 'f'],
               'column3': [0.5, 0.6, .04],
               'column4': [0.7, 0.8, 0.9],
               'Reason': ['correct, should not have', 'correct, should not have', 'correct, should not have'],
               })

Любая помощь / руководство / альтернатива высоко ценится.

1 Ответ

0 голосов
/ 12 марта 2020

Первая длина списка condition должна быть такой же, как и choices1, поэтому последнее условие комментируется (удаляется) для длины 2.

Затем, если сравнение по isin, выводом является условие (маска) , поэтому сравнивать с колонкой не имеет смысла.

Последняя проблема заключалась в том, что требовался список длиной 2, поэтому заменили & на , и удалили паратезы в списке choices1 для избежания кортежей:

condition = [(df_merge['column1'] == 'a') & df_merge['column2'].isin(bb),
             (df_merge['column1'] == 'c') & df_merge['column2'].isin(dd)
#             (df_merge['column1'] == 'e') & df_merge['column2'].isin(ff),
             ]

choices1 = [np.where(df_merge['column3'] >= 1, 'should not have','correct'),
            np.where(df_merge['column4'] >= 0.45, 'should not have','correct')]

df_merge['Reason'] = np.select(condition, choices1, default='correct')
print (df_merge)
  column1 column2  column3  column4           Reason
0       a       b     0.50      0.7          correct
1       c       d     0.60      0.8  should not have
2       e       f     0.04      0.9          correct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...