Нет легкий способ. Панды не предназначены для такого рода задач, они не векторизованы. Лучшим вариантом может быть понимание списка:
s1 = df['dist_matches'].astype(str)
s2 = df['name_matches'].astype(str).str.split(',')
mask = [i in j for i, j in zip(s1, s2)]
df['comb_match'] = np.where(mask, df['dist_matches'], np.nan)
Сравнительный анализ производительности
Чтобы продемонстрировать тот факт, что методы Pandas str
на самом деле не векторизованы:
# Python 3.6.5, Pandas 0.23.0
def wen(df):
Bool = df.name_matches.str.split(',',expand=True).isin(df.dist_matches).any(1)
df['comb_match'] = np.where(Bool, df.dist_matches, '')
return df
def jpp(df):
s1 = df['dist_matches'].astype(str)
s2 = df['name_matches'].astype(str).str.split(',')
mask = [i in j for i, j in zip(s1, s2)]
df['comb_match'] = np.where(mask, df['dist_matches'], np.nan)
return df
df = pd.concat([df]*1000, ignore_index=True)
assert jpp(df).equals(wen(df))
%timeit jpp(df) # 12.2 ms
%timeit wen(df) # 32.7 ms