我目前在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”,条件也应该失败,所以转换甚至都不会发生。
谁能分享任何见识?
答案 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