我正在尝试使用if语句并检查行值是否为NaN。事实证明我认为更加困难
这是一个例子:
df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
'data1': range(6),
'data2': ['A1', 'B1', 'NaN', 'A1', 'B1','NaN']},
columns = ['key', 'data1', 'data2'])
def set_perf(row):
if ("C" in row['key']) & (row['data2']=="NaN"):
return row['data1']
else:
return 1
df['NewColumn'] = df.apply(set_perf, axis=1)
输出
key data1 data2 NewColumn
0 A 0 A1 1
1 B 1 B1 1
2 C 2 NaN 2
3 A 3 A1 1
4 B 4 B1 1
5 C 5 NaN 5
输出给了我正在寻找的东西意味着我能够通过在if语句中添加另一个条件来识别NaN值(行[' data2'] ==" NaN&# 34)
我在原始数据集中应用了完全相同的逻辑,但它没有用。这是一个快照
NewPerfColumn sec_type tran_type LDI Bucket Alpha vs Markit
0 1.000 GOVT BB NaN 3283.400526
1 1.000 GOVT BB NaN 6710.130364
2 1.000 GOVT BB NaN 3266.912122
3 1.000 GOVT BB NaN 113401.946471
4 1.000 GOVT BB NaN 1938.494818
5 1.000 GOVT BB NaN 9505.724498
6 1.000 GOVT BB NaN 192.196620
7 1.000 MUNITAX RRP NaN -97968.750000
当我在if条件中添加(行[' LDI Bucket'] ==" NaN")时,值" NaN"无法识别。 这是列" LDI Bucket"
的不同值data['LDI Bucket'].unique()
array([nan, u'0-3m', u'3-6m', u'6-9m', u'9m-1y'], dtype=object)
我错过了什么吗?
答案 0 :(得分:3)
我错过了什么吗?
是。在您的MWE中,您已将rsp
表示为字符串......但事实并非如此。它是一个浮点数,代表一个不等于任何其他数量的某个数学量,包括它自己。
NaN
是正确的,但"NaN" == "NaN"
不是。这是您的问题的根本原因。
这是天真的修复,使用NaN == NaN
来测试NaNness。
pd.isnull
这是更好的解决方法,使用def set_perf(row):
if ("C" in row['key']) and pd.isnull(row['data2']):
return row['data1']
else:
return 1
并对您的函数进行矢量化。
np.where
答案 1 :(得分:1)
如果是'NaN'
np.where((df.key.apply(lambda x : 'C' in x))&(df['data2']=='NaN'),df['data1'],1)
Out[58]: array([1, 1, 2, 1, 1, 5], dtype=int64)
如果是np.NaN
np.where((df.key.apply(lambda x : 'C' in x))&(df['data2'].isnull()),df['data1'],1)
Out[58]: array([1, 1, 2, 1, 1, 5], dtype=int64)
答案 2 :(得分:0)
&安培;是一种按位和操作,例如
In [5]: 1 & 3
Out[5]: 1
"和"是你要找的,所以if行应该是:
if ("C" in row['key']) and (row['data2']=="NaN"):
答案 3 :(得分:-1)
您可以使用numpy包或if语句
if pd.isnull(row[0]):
print("do it more")
pandas isnull方法将处理你的Nan值。