Python Numpy.where在条件为False时计算为True
我目前在numpy遇到了一些意想不到的行为。我试图在数据框中添加一列,该数据框对另外两列进行计算。这些列还包含几个“N/a”字符串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
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'
时,如果不想计算该表达式,则必须修改方法。