Come riscrivere questo codice in un'espressione apply-lambda?

Aug 25 2020

Il mio dataframe (df) ha alcune voci NaN nella nuova colonna, "s_score", che posso escludere usando func (x). cioè l'esecuzione di document_path_similarity () porta ad alcuni NaN, impedendo l'esecuzione di most_similar_docs () (se non uso prima func (x)). D1, D2 sono df.columns con dati stringa.

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)

C'è un modo per riscrivere questo codice come una riga?

I miei tentativi come di seguito portano a 'ValueError: (' max () arg is an empty sequence 'o 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))

Risposte

1 RobRaymond Aug 25 2020 at 18:34

Non credo ci sia nulla di sbagliato nel tuo pandascodice. Quello che ho scoperto è che similarity_score()sta fallendo perché sta cercando di prendere il massimo da un elenco vuoto. Ho forzato l'elenco a non essere vuoto forzando un punteggio zero. È la prima volta che guardo questa libreria, quindi non dare per scontato che la mia patch sia di buona 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))

produzione

 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