¿Cómo reescribir este código en una expresión apply-lambda?

Aug 25 2020

Mi marco de datos (df) tiene algunas entradas NaN en la nueva columna, 's_score' que puedo excluir usando func (x). es decir, la ejecución de document_path_similarity () conduce a algunos NaN, impidiendo la ejecución de most_similar_docs () (si no uso func (x) primero). D1, D2 son columnas gl con datos de cadena.

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)

¿Hay alguna forma de reescribir este código como una sola línea?

Mis intentos, como el siguiente, conducen a 'ValueError: (' max () arg es una secuencia vacía '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))

Respuestas

1 RobRaymond Aug 25 2020 at 18:34

No creo que haya nada malo en tu pandascódigo. Lo que encontré es que similarity_score()está fallando porque está tratando de tomar el máximo de una lista vacía. Obligé a que la lista no estuviera vacía al forzar una puntuación de cero. Esta es la primera vez que miro esta biblioteca, así que no asuma que mi parche es de buena calidad.

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))

salida

 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