[英]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.