Solicitudes de amistad II: quién tiene más amigos
Escribe una solución para encontrar las personas que tienen más amigos y el mayor número de amigos. Los casos de prueba fueron generados de manera qeu solo una persona tenga el mayor número de amigos.
Tabla: RequestAccepted
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| requester_id | int |
| accepter_id | int |
| accept_date | date |
+----------------+---------+
- (requester_id, accepter_id) es la llave primaria (combinación de columnas con valores únicos).
- Esta tabla contiene el ID del usuario quien envió la solicitud de amistad, y la fecha en que la misma fue aceptada.
El formato del resultado se muestra en el siguiente ejemplo.
Ejemplo 1:
Entrada:
Tabla RequestAccepted:
+--------------+-------------+-------------+
| requester_id | accepter_id | accept_date |
+--------------+-------------+-------------+
| 1 | 2 | 2016/06/03 |
| 1 | 3 | 2016/06/08 |
| 2 | 3 | 2016/06/08 |
| 3 | 4 | 2016/06/09 |
+--------------+-------------+-------------+
Salida:
+----+-----+
| id | num |
+----+-----+
| 3 | 3 |
+----+-----+
Explicación:
- La persona con id=3 es amiga de las personas 1, 2 y 4, de manera que tiene tres amigos en total, por eso es la persona con más amigos de este ejemplo.
Seguimiento: En el mundo real, multiples personas pueden tener el mismo número de amigos. ¿Puedes encontrar todas esas personas en este caso?
Solución:
import pandas as pd
def most_friends(request_accepted: pd.DataFrame) -> pd.DataFrame:
requesters = request_accepted.groupby(
'requester_id').size().reset_index(name='num')
accepters = request_accepted.groupby(
'accepter_id').size().reset_index(name='num')
requesters.rename(
columns={'requester_id': 'id'}, inplace=True)
accepters.rename(
columns={'accepter_id': 'id'}, inplace=True)
result = pd.concat([
requesters, accepters
]).groupby('id')['num'].sum().reset_index()
return result.loc[
result['num'].nlargest(1).index
].reset_index(drop=True)
def test_most_friends():
data = [
[1, 2, '2016/06/03'],
[1, 3, '2016/06/08'],
[2, 3, '2016/06/08'],
[3, 4, '2016/06/09']
]
request_accepted = pd.DataFrame(
data,
columns=[
'requester_id',
'accepter_id',
'accept_date'
]
).astype({
'requester_id': 'Int64',
'accepter_id': 'Int64',
'accept_date': 'datetime64[ns]'
})
expected = pd.DataFrame({'id': [3], 'num': [3]})
got = most_friends(request_accepted)
pd.testing.assert_frame_equal(
got, expected, check_dtype=False)