[英]Where function ignoring Nan
我正在嘗試使用 where function 而忽略 Nan,我不想放棄或更換 Nans。
這是一個玩具數據集:
df=pd.DataFrame({
'A':[8,39,40,52],
'B':[8,39,np.nan,50],
})
這使:
A B
0 8 8.0
1 39 39.0
2 40 NaN
3 52 50.0
期望的結果:
A B check
0 8 8.0 True
1 39 39.0 True
2 40 NaN Nan
3 52 50.0 False
我嘗試了以下代碼,但沒有奏效:
df = ((np.where(df['A']== df['B'], True, False))| df.isnull())
只需做一個where
:
df['A'].eq(df['B']).where(df[['A','B']].notna().all(1))
但這會沮喪 upcast True, False
to float
。
您可以在任一列中有NaN
的地方使用掩碼,然后使用 boolean 掩碼將np.nan
插入其中。
m = df.isna().any(axis=1)
df['check'] = df['A'].eq(df['B'])
df.loc[m, 'check'] = np.nan # This would upcast bools to floats.
一種解決方法是使用Series.astype
將check
列的 dtype 設為object
。
m = df.isna().any(axis=1)
df['check'] = df['A'].eq(df['B'])
df['check'] = df['check'].astype(object)
df.loc[m, 'check'] = np.nan
A B check
0 8 8.0 True
1 39 39.0 True
2 40 NaN NaN
3 52 50.0 False
#Using df.apply
import pandas as pd
import numpy as np
df=pd.DataFrame({
'A':[8,39,40,52],
'B':[8,39,np.nan,50],
})
def check(df):
if not (pd.isnull(df["A"]) or pd.isnull(df["B"])):
if df["A"]==df["B"]:
return "True"
else:
return "False"
else:
return "Nan"
df["check"]=""
df["check"]=df.apply(check,axis=1)
print(df)
output:
A B check
0 8 8.0 True
1 39 39.0 True
2 40 NaN Nan
3 52 50.0 False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.