比较两列并保留NaN

时间:2019-03-26 03:01:38

标签: python pandas

我的数据具有c1c2的结构,我想生成c3

 c1  c2    c3
  x   x  True
NaN   y   NaN
  x NaN   NaN
  y   x False

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

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 +行,并且此过程是针对多列对完成的

有没有更有效或更优雅的方法来达到相同的结果。 我正在使用熊猫0.24.1

4 个答案:

答案 0 :(得分:2)

这里不需要使用 col3 col4 col1 col2 A foo 3 False B bar 1 False Hello baz 3 True C foz 4 False apply,使用nunique + isnull anymask行中检查一个具有唯一值到NaN

NaN

答案 1 :(得分:1)

使用np.select

的解决方案
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    

答案 2 :(得分:0)

您的编辑答案:

cols_to_compare = [('col1', 'col2'), ('col3', 'col4')]

df[['comp1', 'comp2']] = pd.DataFrame([df[a].eq(df[b]).astype(object)\
                                                       .mask(df[[a,b]].isnull().any(1)) \
                                       for a,b in cols_to_compare]).T

答案 3 :(得分:0)

尝试以下方法:

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

df.loc[df.isnull().any(1), 'c3'] = np.nan