Python 将熊猫中的两列与NaN进行比较,得出差异
我有以下数据帧:Python 将熊猫中的两列与NaN进行比较,得出差异,python,pandas,numpy,dataframe,numpy-ndarray,Python,Pandas,Numpy,Dataframe,Numpy Ndarray,我有以下数据帧: case c1 c2 1 x x 2 NaN y 3 x NaN 4 y x 5 NaN NaN 我想得到一个列“match”,它将显示哪些记录的值在“c1”和“c2”中相等或不同: case c1 c2 match 1 x x True 2 NaN y False 3 x NaN False 4 y x False 5 NaN NaN
case c1 c2
1 x x
2 NaN y
3 x NaN
4 y x
5 NaN NaN
我想得到一个列“match”,它将显示哪些记录的值在“c1”和“c2”中相等或不同:
case c1 c2 match
1 x x True
2 NaN y False
3 x NaN False
4 y x False
5 NaN NaN True
基于另一个堆栈溢出问题,我尝试了以下操作:
然而,我不能同时正确地得到案例4和案例5
import pandas as pd
import numpy as np
df = pd.DataFrame({
'case': [1, 2, 3, 4, 5],
'c1': ['x', np.nan,'x','y', np.nan],
'c2': ['x', 'y',np.nan,'x', np.nan],
})
cond1 = df['c1'] == df['c2']
cond2 = (df['c1'].isnull()) == (df['c2'].isnull())
df['c3'] = np.select([cond1, cond2], [True, True], False)
df
与isna一起使用
eq
:
df.c1.eq(df.c2)|df.iloc[:, 1:].isna().all(1)
#or
df.c1.eq(df.c2)|df.loc[:, ['c1','c2']].isna().all(1)
输出
case c1 c2 c3
0 1 x x True
1 2 NaN y False
2 3 x NaN False
3 4 y x False
4 5 NaN NaN True
使用
nuquine
和fillna
import numpy as np
df.fillna(np.inf)[['c1','c2']].nunique(1) < 2
是否可以向
df.iloc[:,1::].isna()提供实际列名。所有(1)
?
import numpy as np
df.fillna(np.inf)[['c1','c2']].nunique(1) < 2
df[['c1','c2']].nunique(1, dropna=False) < 2
Out[13]:
0 True
1 False
2 False
3 False
4 True
dtype: bool