Comment réécrire ce code dans une expression apply-lambda?
My dataframe (df) a quelques entrées NaN dans la nouvelle colonne, 's_score' que je peux exclure en utilisant func (x). c'est-à-dire que l'exécution de document_path_similarity () conduit à des NaN, empêchant l'exécution de most_similar_docs () (si je n'utilise pas func (x) en premier). D1, D2 sont des colonnes df avec des données de chaîne.
df
Quality D1 D2
0 1 Ms Stewart, the chief executive... Ms Stewart, 61, its chief executive
1 1 After more than two years' det... After more than two years in
def most_similar_docs():
def func(x):
try:
return document_path_similarity(x['D1'], x['D2'])
except:
return np.nan
df['s_score'] = df.apply(func, axis=1)
Existe-t-il un moyen de réécrire ce code en une seule ligne?
Mes tentatives comme ci-dessous conduisent à 'ValueError: (' max () arg est une séquence vide 'ou SyntaxError.
df['s_scores'] = df.apply(lambda x: document_path_similarity(x.D1, x.D2),axis=1)
paraphrases['s_scores'] = paraphrases.apply(lambda x: document_path_similarity(x.D1, x.D2),axis=1 if np.isnan(x))
Réponses
Je ne pense pas qu'il y ait quelque chose de mal avec votre pandascode. Ce que j'ai trouvé, c'est que cela similarity_score()échoue car il essaie de prendre au maximum une liste vide. J'ai forcé la liste à être non vide en forçant un score nul. C'est la première fois que je regarde cette bibliothèque, alors ne supposez pas que mon correctif est un correctif de bonne qualité.
import io
df = pd.read_csv(io.StringIO(""" Quality D1 D2
0 1 Ms Stewart, the chief executive... Ms Stewart, 61, its chief executive
1 1 After more than two years' det... After more than two years in """), sep="\s\s+", engine="python")
def similarity_score(s1, s2):
list1 = []
for a in s1:
# patch +[0] at end so never finding max of empty list
list1.append(max([i.path_similarity(a) for i in s2 if i.path_similarity(a) is not None]+[0]))
output = sum(list1)/len(list1)
return output
df = df.assign(
s_scores=lambda x: x.apply(lambda r: document_path_similarity(r.D1, r.D2), axis=1)
)
print(df.to_string(index=False))
production
Quality D1 D2 s_scores
1 Ms Stewart, the chief executive... Ms Stewart, 61, its chief executive 0.838889
1 After more than two years' det... After more than two years in 0.912500