Skip to main content
Back to problems
#1699
Medium Database

Number of calls between two persons

Database
80.8% acceptance
Mar 31, 2026
312
16

No description available.

Solution

Pandas
Time O(1)
Space O(1)
LeetCode
solution.pandas
# Table: Calls
# 
# +-------------+---------+
# | Column Name | Type    |
# +-------------+---------+
# | from_id     | int     |
# | to_id       | int     |
# | duration    | int     |
# +-------------+---------+
# This table does not have a primary key (column with unique values), it may contain duplicates.
# This table contains the duration of a phone call between from_id and to_id.
# from_id != to_id
# 
#  
# 
# Write a solution to report the number of calls and the total call duration between each pair of distinct persons (person1, person2) where person1 < person2.
# 
# Return the result table in any order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Calls table:
# +---------+-------+----------+
# | from_id | to_id | duration |
# +---------+-------+----------+
# | 1       | 2     | 59       |
# | 2       | 1     | 11       |
# | 1       | 3     | 20       |
# | 3       | 4     | 100      |
# | 3       | 4     | 200      |
# | 3       | 4     | 200      |
# | 4       | 3     | 499      |
# +---------+-------+----------+
# Output:
# +---------+---------+------------+----------------+
# | person1 | person2 | call_count | total_duration |
# +---------+---------+------------+----------------+
# | 1       | 2       | 2          | 70             |
# | 1       | 3       | 1          | 20             |
# | 3       | 4       | 4          | 999            |
# +---------+---------+------------+----------------+
# Explanation:
# Users 1 and 2 had 2 calls and the total duration is 70 (59 + 11).
# Users 1 and 3 had 1 call and the total duration is 20.
# Users 3 and 4 had 4 calls and the total duration is 999 (100 + 200 + 200 + 499).

import pandas as pd

def number_of_calls(calls: pd.DataFrame) -> pd.DataFrame:
  calls['person1'] = calls[['from_id', 'to_id']].min(axis=1)
  calls['person2'] = calls[['from_id', 'to_id']].max(axis=1)
  result = calls.groupby(['person1', 'person2']).agg(
    call_count=('duration', 'count'),
    total_duration=('duration', 'sum')
  ).reset_index()
  return result