Table: Queries
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| query_name | varchar |
| result | varchar |
| position | int |
| rating | int |
+-------------+---------+
이 테이블은 중복된 행을 포함할 수 있습니다.
이 테이블은 데이터베이스에서 수집된 일부 쿼리 정보를 포함하고 있습니다.
position 열은 1에서 500까지의 값을 가집니다.
rating 열은 1에서 5까지의 값을 가집니다. rating이 3 미만인 쿼리는 불량 쿼리입니다.
문제
쿼리 품질은 다음과 같이 정의됩니다 : 쿼리 평점과 그 쿼리의 위치 간의 비율의 평균.
불량 쿼리 비율은 다음과 같이 정의됩니다 : 평점이 3 미만인 모든 쿼리의 비율.
각 query_name, 품질, 불량 쿼리 비율을 구하는 솔루션을 작성하세요.
품질과 불량 쿼리 비율은 소수점 둘째 자리까지 반올림해야 합니다.
결과 테이블은 순서에 상관없이 반환해주세요.
결과 형식은 아래 예시와 같습니다.
Example 1:
Input:
Queries table:
+------------+-------------------+----------+--------+
| query_name | result | position | rating |
+------------+-------------------+----------+--------+
| Dog | Golden Retriever | 1 | 5 |
| Dog | German Shepherd | 2 | 5 |
| Dog | Mule | 200 | 1 |
| Cat | Shirazi | 5 | 2 |
| Cat | Siamese | 3 | 3 |
| Cat | Sphynx | 7 | 4 |
+------------+-------------------+----------+--------+
Output:
+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog | 2.50 | 33.33 |
| Cat | 0.66 | 33.33 |
+------------+---------+-----------------------+
설명 :
Dog 쿼리의 품질은 ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50
Dog 쿼리의 불량 쿼리 비율은 (1 / 3) * 100 = 33.33
Cat 쿼리의 품질은 ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66
Cat 쿼리의 불량 쿼리 비율은 (1 / 3) * 100 = 33.33
✏️ 풀이
# 풀이1 #
import pandas as pd
def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
result = queries.groupby('query_name').apply(lambda x : pd.Series({
'quality' : round(((x['rating'] / x['position']).sum()) / len(x), 2),
'poor_query_percentage' : round((((x['rating'] < 3).sum() / len(x)) * 100), 2)})).reset_index()
return result
# 풀이2 #
import pandas as pd
def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
queries['rp'] = queries['rating'] / queries['position']
result = queries.groupby('query_name').agg(
quality = ('rp', lambda x : round(x.sum() / len(x), 2)),
poor_query_percentage = ('rating', lambda x : round((x < 3).sum() / len(x) * 100, 2))).reset_index()
return result
# 풀이3 #
import pandas as pd
def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
queries['quality'] = queries['rating'] / queries['position']
queries['poor_query_percentage'] = (queries['rating'] < 3).astype(int) * 100
result = queries.groupby('query_name')[['quality', 'poor_query_percentage']].mean().round(2).reset_index()
return result
풀이 1은 apply()와 Series()를 사용해서 한 번에 모든 집계를 끝내는 코드
풀이 2는 rating/position 값을 미리 구해 agg()를 써서 집계하는 코드
풀이 3은 각각의 계산에서 각 query_name별 전체 row수에서 나눠야 하기 때문에 그 이전 계산식까지 미리 값을 구한 후 마지막에 groupby를 통해서 평균 값을 구하는 코드
apply()를 써서 한 번에 풀려고 하다보니까 꽤 많이 헤멨다
처음엔 Series로 푸는걸 몰라서 agg와 똑같은 형태로 풀어서 계속 에러가 났었다
나는 풀이 2번에 가장 먼저 떠오른 풀이 방법이라 해당 풀이가 제일 쉬웠고 다른 사람들 풀이를 보니 3번과 같은 풀이 방법도 있어서 한 번 풀어 보았다
'[코딩테스트] > [Pandas]' 카테고리의 다른 글
[LeetCode - Pandas] (Easy) 1148. Article Views I (0) | 2025.04.21 |
---|---|
[LeetCode - Pandas] (Easy) 1179. Reformat Department Table (0) | 2025.04.21 |
[LeetCode - Pandas] (Easy) 1251. Average Selling Price (0) | 2025.04.19 |
[LeetCode - Pandas] (Easy) 1280. Students and Examinations (0) | 2025.04.18 |
[LeetCode - Pandas] (Easy) 1327. List the Products Ordered in a Period (0) | 2025.04.18 |