Table: Visits
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| visit_id | int |
| customer_id | int |
+-------------+---------+
visit_id는 이 테이블에서 고유 값을 가진 열입니다.
이 테이블은 쇼핑몰을 방문한 고객에 대한 정보를 포함하고 있습니다.
Table: Transactions
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| transaction_id | int |
| visit_id | int |
| amount | int |
+----------------+---------+
transaction_id는 이 테이블에서 고유 값을 가진 열입니다.
이 테이블은 visit_id 동안 이루어진 거래에 대한 정보를 포함하고 있습니다.
문제
사용자가 거래를 하지 않고 방문한 ID와 이들이 이러한 유형의 방문을 한 횟수를 찾는 해결책을 작성하십시오.
결과 테이블은 임의의 순서로 정렬하여 반환하십시오.
결과 형식은 아래 예시와 같습니다.
Example 1:
Input:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1 | 23 |
| 2 | 9 |
| 4 | 30 |
| 5 | 54 |
| 6 | 96 |
| 7 | 54 |
| 8 | 54 |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2 | 5 | 310 |
| 3 | 5 | 300 |
| 9 | 5 | 200 |
| 12 | 1 | 910 |
| 13 | 2 | 970 |
+----------------+----------+--------+
Output:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54 | 2 |
| 30 | 1 |
| 96 | 1 |
+-------------+----------------+
설명 :
id = 23인 고객은 한 번 쇼핑몰을 방문했으며, visit_id = 12에서 한 번의 거래를 했습니다.
id = 9인 고객은 한 번 쇼핑몰을 방문했으며, visit_id = 13에서 한 번의 거래를 했습니다.
id = 30인 고객은 한 번 쇼핑몰을 방문했으며, 거래를 하지 않았습니다.
id = 54인 고객은 세 번 쇼핑몰을 방문했으며, 그 중 두 번은 거래를 하지 않았고, 한 번은 세 번의 거래를 했습니다.
id = 96인 고객은 한 번 쇼핑몰을 방문했으며, 거래를 하지 않았습니다.
위에서 알 수 있듯이, id가 30과 96인 사용자들은 한 번 방문했으며 거래를 하지 않았습니다. 또한, id가 54인 사용자는 두 번 방문했으며 거래를 하지 않았습니다.
✏️ 풀이
import pandas as pd
def find_customers(visits: pd.DataFrame, transactions: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(visits, transactions, how='left', on='visit_id')
result = df[df['transaction_id'].isna()]
result = result.groupby('customer_id')['customer_id'].count().reset_index(name='count_no_trans')
return result[['customer_id', 'count_no_trans']]
1. visits테이블에 transactions테이블을 left join 한다
2. left join을 하게 되면 거래가 없는 id는 transaction_id와 amount가 null로 나온다
3. 2번의 null 값인 데이터만 필터
4. 해당 DataFrame을 groupby 해서 count()
'[코딩테스트] > [Pandas]' 카테고리의 다른 글
[LeetCode - Pandas] 1517. Find Users With Valid E-Mails (0) | 2025.04.16 |
---|---|
[LeetCode - Pandas] (Easy) 1527. Patients With a Condition (0) | 2025.04.15 |
[LeetCode - Pandas] (Easy) 1587. Bank Account Summary II (0) | 2025.04.14 |
[LeetCode - Pandas] (Easy) 1633. Percentage of Users Attended a Contest (0) | 2025.04.14 |
[LeetCode - Pandas] (Easy) 1661. Average Time of Process per Machine (0) | 2025.04.11 |