Comment réécrire ce code dans une expression apply-lambda?

Aug 25 2020

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

1 RobRaymond Aug 25 2020 at 18:34

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