np.logical_and с тремя тестами - PullRequest
       0

np.logical_and с тремя тестами

0 голосов
/ 12 ноября 2018

Я пытаюсь обновить столбец в моем фрейме данных на основе тестирования и результатов значений в трех столбцах (3 теста).

Пример кода:

df_test = pd.DataFrame([('?',2.0,1,0,0,0), (None,2.0,1,0,0,0), 
                        (None,2.0,0,0,0,0),(None,2.0,0,1,0,0), 
                        ('?',2.0,0,0,0,0)], columns=['a','b','c','d','e','f'])
df_test.head()

Когда я попробую следующее df_test['g'] = np.where(np.logical_and(df_test['a'] != 'None', df_test['c'] == 0, df_test['d'] == 0), True, False).astype(int) Я получаю сообщение об ошибке TypeError: return arrays must be of ArrayType Поэтому я пытаюсь сделать следующее:

df_test = pd.DataFrame([('?',2.0,1,0,0,0), (None,2.0,1,0,0,0), 
                        (None,2.0,0,0,0,0),(None,2.0,0,1,0,0), 
                        ('?',2.0,0,0,0,0)], columns=['a','b','c','d','e','f'])
df_test['g'] = np.where(np.logical_and(df_test['a'] != None, 
                                       np.logical_and(df_test['c'] == 0, 
                                                      df_test['d'] == 0)), 
                        True, False).astype(int)
df_test.head()

И в строке 2, где я ожидал увидеть 0, я вижу 1, в то время как строка 4 кажется правильной. Тест 1 (a) должен быть ложным, в то время как второй (c) и третий (d) тесты должны быть True, True. Ложь == Истина == Истина Ложь.

    a   b   c   d   e   f   g
0   ?   2.0 1   0   0   0   0
1   None    2.0 1   0   0   0   0
2   None    2.0 0   0   0   0   1
3   None    2.0 0   1   0   0   0
4   ?   2.0 0   0   0   0   1

Мне нужен способ оценить 3 теста и вернуть true или false как целое число.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Попробуйте:

df_test ['htest'] = (df_test ['a']. Isna () & (df_test ['c'] == 0) & (df_test ['d'] == 0)). astype (INT)

df_test['htest' ] = (df_test['a'].notna() & (df_test['c'] == 0) &  (df_test['d'] == 0)).astype(int)

Выход:

      a    b  c  d  e  f  htest
0     ?  2.0  1  0  0  0      0
1  None  2.0  1  0  0  0      0
2  None  2.0  0  0  0  0      0
3  None  2.0  0  1  0  0      0
4     ?  2.0  0  0  0  0      1
0 голосов
/ 12 ноября 2018

Для 3 или более условий используйте np.logical_and.reduce и передайте список масок;

mask = np.logical_and.reduce([
        df_test['a'].notna(), df_test['c'].eq(0), df_test['d'].eq(0)])
df_test['g'] = mask.astype(int)

print(df_test)
      a    b  c  d  e  f  g
0     ?  2.0  1  0  0  0  0
1  None  2.0  1  0  0  0  0
2  None  2.0  0  0  0  0  0
3  None  2.0  0  1  0  0  0
4     ?  2.0  0  0  0  0  1

Последующие np.where здесь излишни.

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