Python 比较两列并保留NAN

Python 比较两列并保留NAN,python,pandas,Python,Pandas,我的数据的结构是c1和c2,我想生成c3 我的方法产生了想要的结果,但速度非常慢: import pandas as pd import numpy as np df = pd.DataFrame({ 'c1': ['x', np.nan,'x','y'], 'c2': ['x', 'y',np.nan,'x'], }) df['c3'] = df.apply(lambda row: row['c1'] == row['c2'] if type(row['c1']) is s

我的数据的结构是c1和c2,我想生成c3

我的方法产生了想要的结果,但速度非常慢:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'c1': ['x', np.nan,'x','y'],
    'c2': ['x', 'y',np.nan,'x'],
})

df['c3'] = df.apply(lambda row: row['c1'] == row['c2'] if type(row['c1']) is str and type(row['c2']) is str else np.nan, axis=1)
我的方法非常慢,因为我的数据集有100k+行,这个过程是针对多个列对完成的

有没有更有效或更优雅的方法来达到同样的效果。 我使用的是pandas 0.24.1

您不需要在此处使用NUNIKE检查一个是否有唯一值,使用isnull+任何掩码将NaN行屏蔽为NaN

请尝试以下内容:

df['c3']=df.c1==df.c2

df.loc[df.isnull.any1,'c3']=np.nan

使用np.select的解决方案

输出:

  c1   c2     c3                                                                                                                    
0    x    x   True                                                                                                                    
1  NaN    y   None                                                                                                                    
2    x  NaN   None                                                                                                                    
3    y    x  False    

多栏是什么意思?你会一次比较两个以上吗?或者您总是一次比较twp列,但有许多不同的组合?感谢您指出这一点,我已经更新了我的问题。
(df.nunique(1)==1).astype(object).mask(df.isnull().any(1))
Out[61]: 
0     True
1      NaN
2      NaN
3    False
dtype: object
cond2 = df['c1'] == df['c2']
cond1 = (df['c1'].isnull()) | (df['c2'].isnull())

df['c3'] = np.select([cond1, cond2], [None, True], False)

print(df)
  c1   c2     c3                                                                                                                    
0    x    x   True                                                                                                                    
1  NaN    y   None                                                                                                                    
2    x  NaN   None                                                                                                                    
3    y    x  False