Skip to main content
Back to problems
#2720
Hard Database

Popularity percentage

Database
53.2% acceptance
Mar 31, 2026
14
9

No description available.

Solution

Pandas
Time O(n)
Space O(1)
LeetCode
solution.pandas
# Table: Friends
# 
# +-------------+------+
# | Column Name | Type |
# +-------------+------+
# | user1       | int  |
# | user2       | int  |
# +-------------+------+
# (user1, user2) is the primary key (combination of unique values) of this table.
# Each row contains information about friendship where user1 and user2 are friends.
# 
# Write a solution to find the popularity percentage for each user on Meta/Facebook. The popularity percentage is defined as the total number of friends the user has divided by the total number of users on the platform, then converted into a percentage by multiplying by 100, rounded to 2 decimal places.
# 
# Return the result table ordered by user1 in ascending order.
# 
# The result format is in the following example.
#
# Example 1:
# Input: 
# Friends table:
# +-------+-------+
# | user1 | user2 |
# +-------+-------+
# | 2     | 1     |
# | 1     | 3     |
# | 4     | 1     |
# | 1     | 5     |
# | 1     | 6     |
# | 2     | 6     |
# | 7     | 2     |
# | 8     | 3     |
# | 3     | 9     |
# +-------+-------+
# Output: 
# +-------+-----------------------+
# | user1 | percentage_popularity |
# +-------+-----------------------+
# | 1     | 55.56                 |
# | 2     | 33.33                 |
# | 3     | 33.33                 |
# | 4     | 11.11                 |
# | 5     | 11.11                 |
# | 6     | 22.22                 |
# | 7     | 11.11                 |
# | 8     | 11.11                 |
# | 9     | 11.11                 |
# +-------+-----------------------+
# Explanation: 
# There are total 9 users on the platform.
# - User "1" has friendships with 2, 3, 4, 5 and 6. Therefore, the percentage popularity for user 1 would be calculated as (5/9) * 100 = 55.56.
# - User "2" has friendships with 1, 6 and 7. Therefore, the percentage popularity for user 2 would be calculated as (3/9) * 100 = 33.33.
# - User "3" has friendships with 1, 8 and 9. Therefore, the percentage popularity for user 3 would be calculated as (3/9) * 100 = 33.33.
# - User "4" has friendships with 1. Therefore, the percentage popularity for user 4 would be calculated as (1/9) * 100 = 11.11.
# - User "5" has friendships with 1. Therefore, the percentage popularity for user 5 would be calculated as (1/9) * 100 = 11.11.
# - User "6" has friendships with 1 and 2. Therefore, the percentage popularity for user 6 would be calculated as (2/9) * 100 = 22.22.
# - User "7" has friendships with 2. Therefore, the percentage popularity for user 7 would be calculated as (1/9) * 100 = 11.11.
# - User "8" has friendships with 3. Therefore, the percentage popularity for user 8 would be calculated as (1/9) * 100 = 11.11.
# - User "9" has friendships with 3. Therefore, the percentage popularity for user 9 would be calculated as (1/9) * 100 = 11.11.
# user1 is sorted in ascending order.

import pandas as pd

def popularity_percentage(friends: pd.DataFrame) -> pd.DataFrame:
  # Create bidirectional friendships
  all_friends = pd.concat([
    friends[['user1', 'user2']],
    friends.rename(columns={'user1': 'user2', 'user2': 'user1'})[['user1', 'user2']]
  ])
  
  total_users = pd.concat([friends['user1'], friends['user2']]).nunique()
  
  friend_counts = all_friends.groupby('user1')['user2'].nunique().reset_index()
  friend_counts.columns = ['user1', 'percentage_popularity']
  friend_counts['percentage_popularity'] = (friend_counts['percentage_popularity'] / total_users * 100).round(2)
  
  return friend_counts.sort_values('user1')