簡體   English   中英

如果條件與isnan語句結合

[英]combine if condition with isnan 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值(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

當我在if條件中添加(row ['LDI Bucket'] ==“ NaN”)時,無法識別值“ NaN”。 這是“ LDI桶”列的不同值

data['LDI Bucket'].unique()
array([nan, u'0-3m', u'3-6m', u'6-9m', u'9m-1y'], dtype=object)

我錯過了什么嗎?

我錯過了什么嗎?

是。 在您的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

這是更好的解決方法,請使用np.where並向量化您的函數。

df['NewColumn'] = np.where(
    df['key'].str.contains('C') & df['data2'].isnull(), df['data1'], 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)

&是按位運算的,例如

In [5]: 1 & 3
Out[5]: 1

“ and”是您要查找的內容,因此if行應為:

  if ("C" in row['key']) and (row['data2']=="NaN"):

您可以使用numpy包或if語句,例如

if pd.isnull(row[0]):
  print("do it more")   

熊貓isull方法將處理您的Nan值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM