首页 > 解决方案 > 比较两列并保留 NaN

问题描述

我的数据的结构是c1并且c2我想生成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

标签: pythonpandas

解决方案


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

推荐阅读