Python 比较两列并保留NAN
我的数据的结构是c1和c2,我想生成c3 我的方法产生了想要的结果,但速度非常慢: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
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