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.

#pandas#subqueries

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)

slackmart blog © 2024