我当前在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.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