¿Cómo reescribir este código en una expresión apply-lambda?
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
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