Where 函数忽略 Nan
Where function ignoring Nan
我试图在忽略 Nan 的同时使用 where 函数,我不想删除或替换 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))
但是这会向下转换向上转换True, False
到float
。
您可以在任一列中有 NaN
的地方使用掩码,然后使用布尔掩码在其中插入 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
列的数据类型设为 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
我试图在忽略 Nan 的同时使用 where 函数,我不想删除或替换 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))
但是这会向下转换向上转换True, False
到float
。
您可以在任一列中有 NaN
的地方使用掩码,然后使用布尔掩码在其中插入 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
列的数据类型设为 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