Python Numpy.where在条件为False时计算为True

Python Numpy.where在条件为False时计算为True,python,pandas,numpy,Python,Pandas,Numpy,我目前在numpy遇到了一些意想不到的行为。我试图在数据框中添加一列,该数据框对另外两列进行计算。这些列还包含几个“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

我目前在numpy遇到了一些意想不到的行为。我试图在数据框中添加一列,该数据框对另外两列进行计算。这些列还包含几个“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上得到一个错误。其中:

ValueError: could not convert string to float: N/A
我的印象是,鉴于其中一个值为“N/A”时该条件应已失败,甚至不应发生转换


任何人都可以分享一些见解吗?

通常,Python函数的所有参数都是在调用函数之前计算的。您想要的行为将出现在
for
循环中,但这将是缓慢而丑陋的

相反,您应该使用
pd.\u 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

通常,Python函数的所有参数都是在调用函数之前计算的。您想要的行为将出现在
for
循环中,但这将是缓慢而丑陋的

相反,您应该使用
pd.\u 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

np。其中
是一个常规Python函数。Python在将所有参数传递给函数之前对其进行求值。这意味着计算
my_df['Value A'].astype(float)-my_df['Value B'].astype(float)
,并将该计算结果作为
np的第二个参数传递。其中
。当其中一个值是字符串
'N/A'
np时,如果不想对该表达式求值,则必须修改方法。Python在将所有参数传递给函数之前对其进行求值。这意味着计算
my_df['Value A'].astype(float)-my_df['Value B'].astype(float)
,并将该计算结果作为
np的第二个参数传递。其中
。当其中一个值是字符串
'N/A'
时,如果不想计算该表达式,则必须修改方法。