Numpy.where,条件为False时评估为True

时间:2019-05-08 02:33:45

标签: python pandas numpy

我目前在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 个答案:

答案 0 :(得分:2)

一般来说,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