+---------------+---------+
| 열 이름 | 유형 |
+---------------+---------+
| 기사 ID | 정수 |
| 작성자 ID | 정수 |
| 뷰어 ID | 정수 |
| 보기 날짜 | 날짜 |
+---------------+---------+
이 테이블에는 기본 키(고유 값을 가진 열)가 없으므로 중복 행이 있을 수 있습니다.
이 표의 각 행은 특정 날짜에 특정 독자가 특정 저자가 작성한 기사를 읽었음을 나타냅니다.
author_id와 viewer_id가 같으면 동일 인물임을 나타냅니다.
자신의 논문을 최소 한 편 이상 조회한 모든 저자를 찾는 방법을 작성하세요.
결과 테이블을 id오름차순으로 정렬하여 반환합니다.
결과 형식은 다음 예시와 같습니다.
예시 1:
입력:
조회수 테이블:
+------------+-----------+-----------+------------+
| 기사 ID | 저자 ID | 시청자 ID | 조회 날짜 |
+------------+-----------+-----------+------------+
| 1 | 3 | 5 | 2019년 8월 1일 |
| 1 | 3 | 6 | 2019년 8월 2일 |
| 2 | 7 | 7 | 2019-08-01 |
| 2 | 7 | 6 | 2019년 8월 2일 |
| 4 | 7 | 1 | 2019년 7월 22일 |
| 3 | 4 | 4 | 2019년 7월 21일 |
| 3 | 4 | 4 | 2019년 7월 21일 |
+------------+-----------+-----------+------------+
산출:
+------+
| ID |
+------+
| 4 |
| 7 |
+------+
내가 한 풀이
import pandas as pd
def article_views(views: pd.DataFrame) -> pd.DataFrame:
# 1. 저자 ID와 시청자 ID가 같은 경우만 필터링
new_df = views[views['author_id'] == views['viewer_id']]
# 2. 고유한 author_id만 추출한다. unique 활용
unique_authors = new_df['author_id'].unique()
# 3. 고유한 ID 목록을 'id' 컬럼을 가진 DataFrame으로 변환
result_df = pd.DataFrame({'id': unique_authors})
# 4. 'id' 컬럼을 기준으로 정렬한다. (groupby 대신 sort_values 사용)
result_df = result_df.sort_values(by='id', ascending=True)
return result_df
data = {
'article_id': [1, 1, 2, 2, 4, 3, 3],
'author_id': [3, 3, 7, 7, 7, 4, 4],
'viewer_id': [5, 6, 7, 6, 1, 4, 4],
'view_date': ['2019-08-01', '2019-08-02', '2019-08-01', '2019-08-02', '2019-07-22', '2019-07-21', '2019-07-21']
}
views = pd.DataFrame(data) # 저자 ID 시청자 ID 같아야 함
result = article_views(views)
print(result)
트러블 슈팅
우선, 맨처음에 한줄로 필터링 그룹바이 하고, 반환한다. 이렇게 생각했는데
한 줄 한줄 다 해야 했던것. 게다가 unique까지 빼먹었다 첨엔..
중복 안되게 unique를 써주고 sort_values를 하는 방법을 채택.
그리고 3번처럼 컬럼명 author_id에서 id로 바꾸는 방법도 첨 알았다.
제미나이의 그룹바이만 써서 푸는 코드
import pandas as pd
def article_views(views: pd.DataFrame) -> pd.DataFrame:
# 1. 저자 ID와 시청자 ID가 같은 행만 필터링합니다.
new_df = views[views['author_id'] == views['viewer_id']]
# 2. 'author_id'를 기준으로 그룹화하고, 첫 번째 값(first())을 집계합니다.
# - as_index=False: 그룹 키(author_id)를 인덱스가 아닌 일반 컬럼으로 유지합니다.
# - sort=True: 그룹 키(author_id)를 오름차순으로 정렬합니다.
# - ['author_id']: 중복된 author_id를 제거하는 것이 목적이므로,
# author_id 컬럼에 대해서만 집계를 수행합니다. (다른 컬럼을 사용해도 무방)
result_series = new_df.groupby(
'author_id',
as_index=False,
sort=True
)['author_id'].first()
# 3. 컬럼 이름을 'id'로 변경하고 반환합니다.
result_df = result_series.rename(columns={'author_id': 'id'})
return result_df
# --- 데이터 및 실행 ---
data = {
'article_id': [1, 1, 2, 2, 4, 3, 3],
'author_id': [3, 3, 7, 7, 7, 4, 4],
'viewer_id': [5, 6, 7, 6, 1, 4, 4],
'view_date': ['2019-08-01', '2019-08-02', '2019-08-01', '2019-08-02', '2019-07-22', '2019-07-21', '2019-07-21']
}
views = pd.DataFrame(data)
result = article_views(views)
print(result)