Soluci贸n

Pandas

Estrateg铆a: Fusionar los DataFrames usando concat() y encontrar los valores m谩s altos usando sort_values y head

Algoritmo

Dado que una persona puede adquirir un amigo ya sea solicitando o aceptando una solicitud de amistad, para obtener cu谩ntos amigos cada persona tiene, podemos contar cu谩ntas veces su ID aparece en cualquiera de las columnas requester_id y accepter_id. Generalmente es una buena idea combinar las dos columnas en una sola para facililar el c谩lculo.

Empecemos por combinar las dos columnas. Podemos usar la funci贸n concat() para combinar los DataFrames justo como si usaramos UNION/UNION ALL en MySQL, o, en este caso, combinar solo las columnas. Agregamos la funci贸n to_frame() para convertir el resultado de Series a DataFrame. Para realizar el conteo, tambi茅n renombramos la nueva columna como id.

values = pd.concat([
    request_accepted["requester_id"],
    request_accepted["accepter_id"]]
).to_frame('id')

Ahora que tenemos las dos columnas combinadas.

id
1
1
2
3
2
3
3
4

Ahora solo necesitamos contar cuantas veces cada id aparece en la lista para identificar el id con mas apariciones. Para hacer esto, podemos aplicar la funci贸n count() para id y agrupar el resultado al nivel de id. Usamos la funci贸n agg() para obtener el valor agregado y renombrar el resultado al mismo tiempo. Para encontrar el vamir m谩ximo, ordenamos la lista por el contador (la nueva columna num) en orden descendente mediante la funci贸n sort_values() y pasando el parametro ascending=False. El id de la persona con m谩s amigos se encontrar谩 ahora en la primera posici贸n, y podemos acceder directamente a ella usando la funci贸n head().

df = values.groupby(
    'id', as_index=False
).agg(num=('id', 'count')).sort_values(
    'num', ascending=False
).head(1)

Implementaci贸n

import pandas as pd

def most_friends(request_accepted: pd.DataFrame) -> pd.DataFrame:
    values = pd.concat([
        request_accepted["requester_id"],
        request_accepted["accepter_id"]]
    ).to_frame('id')

    df = values.groupby('id', as_index=False).agg(
        num=('id', 'count')
    ).sort_values('num', ascending=False).head(1)

    return df

slackmart blog 漏 2024