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