如果条件与isnan语句结合使用

时间:2018-03-22 16:27:18

标签: python python-2.7 pandas if-statement

我正在尝试使用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)

我错过了什么吗?

4 个答案:

答案 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值。