[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1581. Customer Who Visited but Did Not Make Any Transactions

잰잰' 2025. 4. 15. 11:58
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()