将 if 条件与 isnan 语句结合起来

SBa*_*Bad 3 python if-statement python-2.7 pandas

我正在尝试使用 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)  
Run Code Online (Sandbox Code Playgroud)

输出是

  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
Run Code Online (Sandbox Code Playgroud)

输出给出了我正在寻找的内容,这意味着我可以通过在 if 语句中添加另一个条件来识别 NaN 值 (row['data2']=="NaN")

我在原始数据集中应用了完全相同的逻辑,但它不起作用。这是一个快照

      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
Run Code Online (Sandbox Code Playgroud)

当我在 if 条件中添加 (row['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)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

cs9*_*s95 5

我错过了什么吗?

是的。在您的 MWE 中,您已表示NaN为字符串......但事实并非如此。它是一个浮点数,表示某个数学量,该数学量不等于任何其他量(包括其本身)。

"NaN" == "NaN"是真的,但NaN == NaN事实并非如此。这是您问题的根本原因。

这是简单的修复,用于pd.isnull测试 NaNness。

def set_perf(row):
    if ("C" in row['key']) and pd.isnull(row['data2']): 
        return row['data1']    
    else:        
        return 1
Run Code Online (Sandbox Code Playgroud)

这是更好的修复、使用np.where和矢量化你的函数。

df['NewColumn'] = np.where(
    df['key'].str.contains('C') & df['data2'].isnull(), df['data1'], 1
)
Run Code Online (Sandbox Code Playgroud)