Skip to main content
Back to problems
#3308
Medium Database

Find top performing driver

Database
49.2% acceptance
Mar 31, 2026
7
2

No description available.

Solution

Pandas
Time O(1)
Space O(1)
LeetCode
solution.pandas
# Table: Drivers
# 
# +--------------+---------+
# | Column Name  | Type    |
# +--------------+---------+
# | driver_id    | int     |
# | name         | varchar |
# | age          | int     |
# | experience   | int     |
# | accidents    | int     |
# +--------------+---------+
# (driver_id) is the unique key for this table.
# Each row includes a driver's ID, their name, age, years of driving experience, and the number of accidents they’ve had.
# 
# Table: Vehicles
# 
# +--------------+---------+
# | vehicle_id   | int     |
# | driver_id    | int     |
# | model        | varchar |
# | fuel_type    | varchar |
# | mileage      | int     |
# +--------------+---------+
# (vehicle_id, driver_id, fuel_type) is the unique key for this table.
# Each row includes the vehicle's ID, the driver who operates it, the model, fuel type, and mileage.
# 
# Table: Trips
# 
# +--------------+---------+
# | trip_id      | int     |
# | vehicle_id   | int     |
# | distance     | int     |
# | duration     | int     |
# | rating       | int     |
# +--------------+---------+
# (trip_id) is the unique key for this table.
# Each row includes a trip's ID, the vehicle used, the distance covered (in miles), the trip duration (in minutes), and the passenger's rating (1-5).
# 
# Uber is analyzing drivers based on their trips. Write a solution to find the top-performing driver for each fuel type based on the following criteria:
# 
# A driver's performance is calculated as the average rating across all their trips. Average rating should be rounded to 2 decimal places.
# 
# If two drivers have the same average rating, the driver with the longer total distance traveled should be ranked higher.
# 
# If there is still a tie, choose the driver with the fewest accidents.
# 
# Return the result table ordered by fuel_type in ascending order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Drivers table:
# +-----------+----------+-----+------------+-----------+
# | driver_id | name     | age | experience | accidents |
# +-----------+----------+-----+------------+-----------+
# | 1         | Alice    | 34  | 10         | 1         |
# | 2         | Bob      | 45  | 20         | 3         |
# | 3         | Charlie  | 28  | 5          | 0         |
# +-----------+----------+-----+------------+-----------+
# Vehicles table:
# +------------+-----------+---------+-----------+---------+
# | vehicle_id | driver_id | model   | fuel_type | mileage |
# +------------+-----------+---------+-----------+---------+
# | 100        | 1         | Sedan   | Gasoline  | 20000   |
# | 101        | 2         | SUV     | Electric  | 30000   |
# | 102        | 3         | Coupe   | Gasoline  | 15000   |
# +------------+-----------+---------+-----------+---------+
# Trips table:
# +---------+------------+----------+----------+--------+
# | trip_id | vehicle_id | distance | duration | rating |
# +---------+------------+----------+----------+--------+
# | 201     | 100        | 50       | 30       | 5      |
# | 202     | 100        | 30       | 20       | 4      |
# | 203     | 101        | 100      | 60       | 4      |
# | 204     | 101        | 80       | 50       | 5      |
# | 205     | 102        | 40       | 30       | 5      |
# | 206     | 102        | 60       | 40       | 5      |
# +---------+------------+----------+----------+--------+
# Output:
# +-----------+-----------+--------+----------+
# | fuel_type | driver_id | rating | distance |
# +-----------+-----------+--------+----------+
# | Electric  | 2         | 4.50   | 180      |
# | Gasoline  | 3         | 5.00   | 100      |
# +-----------+-----------+--------+----------+
# Explanation:
# For fuel type Gasoline, both Alice (Driver 1) and Charlie (Driver 3) have trips. Charlie has an average rating of 5.0, while Alice has 4.5. Therefore, Charlie is selected.
# For fuel type Electric, Bob (Driver 2) is the only driver with an average rating of 4.5, so he is selected.
# The output table is ordered by fuel_type in ascending order.

import pandas as pd

def get_top_performing_drivers(drivers: pd.DataFrame, vehicles: pd.DataFrame, trips: pd.DataFrame) -> pd.DataFrame:
  merged = vehicles.merge(trips, on='vehicle_id').merge(drivers, on='driver_id')
  stats = merged.groupby(['fuel_type', 'driver_id', 'accidents']).agg(
    rating=('rating', 'mean'),
    distance=('distance', 'sum')
  ).reset_index()
  stats['rating'] = stats['rating'].round(2)
  stats = stats.sort_values(['fuel_type', 'rating', 'distance', 'accidents'], ascending=[True, False, False, True])
  result = stats.groupby('fuel_type').first().reset_index()
  return result[['fuel_type', 'driver_id', 'rating', 'distance']]