Numpy.where оценивается как Истина, когда условие ложно - PullRequest
0 голосов
/ 08 мая 2019

В настоящее время я испытываю неожиданное поведение в numpy. Я пытаюсь добавить столбец в DataFrame, который делает некоторые математические на двух других столбцах. Эти столбцы также содержат несколько строк «N / A».

import pandas as pd
import numpy as np

my_list = []
my_list.append({'Value A':1, 'Value B':2})
my_list.append({'Value A':6, 'Value B':4})
my_list.append({'Value A':7, 'Value B':5})
my_list.append({'Value A':'N/A', 'Value B':6})
my_list.append({'Value A':12, 'Value B':10})
my_list.append({'Value A':2, 'Value B':2})
my_list.append({'Value A':9, 'Value B':'N/A'})
my_list.append({'Value A':8, 'Value B':3})
my_list.append({'Value A':22, 'Value B':6})

my_df = pd.DataFrame(my_list)

Затем я пытаюсь сделать заявление np.where () по этому вопросу. Сначала я проверяю, что, прежде чем приступить к математике, оба значения не равны 'N / A', потому что я конвертирую их в числа с плавающей точкой, если выполняется условие:

my_df['New'] = np.where((my_df['Value A'].str != 'N/A') & 
                        (my_df['Value B'].str != 'N/A'),
                        my_df['Value A'].astype(float) - my_df['Value B'].astype(float),
                        'N/A')

Однако, когда это выполняется, я получаю сообщение об ошибке на numpy.where:

ValueError: could not convert string to float: N/A

У меня сложилось впечатление, что преобразование даже не должно было произойти, учитывая, что условие должно было быть не выполнено, когда одно из значений было «N / A».

Может ли кто-нибудь поделиться какой-либо проницательностью?

1 Ответ

2 голосов
/ 08 мая 2019

Все аргументы функций Python, как правило, оцениваются перед вызовом функции.Требуемое поведение будет присутствовать в цикле for, но оно будет медленным и уродливым.

Вместо этого следует использовать pd.to_numeric:

converted = my_df[['Value A', 'Value B']].transform(pd.to_numeric, errors='coerce')
result = converted['Value A'] - converted['Value B']

print(result)

filled_result = result.fillna('N/A')

print(filled_result)

Вывод:

0    -1.0
1     2.0
2     2.0
3     NaN
4     2.0
5     0.0
6     NaN
7     5.0
8    16.0
dtype: float64
0     -1
1      2
2      2
3    N/A
4      2
5      0
6    N/A
7      5
8     16
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...