我的数据具有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
答案 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
any
在mask
行中检查一个具有唯一值到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