개요
이전 포스팅 [데이터 처리 #2]에서는 DataFrame을 탐색하는 방법에 대해 알아보았다.
주요 속성 및 메서드를 통해 데이터프레임의 기본 정보를 확인하고, 집계 함수를 통해 수치형 열들에 대한 다양한 통계값을 파악할 수 있다.
2025.06.16 - [Study/Machine Learning, Deep Learning] - [데이터 처리 #2] DataFrame 탐색
[데이터 처리 #2] DataFrame 탐색
개요이전 포스팅 [데이터 처리 #1]에서는 DataFrame을 생성하는 방법에 대해 알아보았다.리스트, 딕셔너리, 외부 파일을 이용하여 데이터프레임을 생성하고, 옵션을 통해 데이터프레임의 index와 열
storyinstory.tistory.com
이번 포스팅에서는 DataFrame에 대해 다음과 같은 내용을 학습 목표로 삼는다.
- Series vs DataFrame
- 일부 행, 일부 열을 조회하는 방법
- 조건에 맞는 행을 조회하는 방법
DataFrame에서 특정 행과 열을 조회하는 방법은 데이터 분석에 있어 가장 중요한 파트라고 말할 수 있다.
특정 조건으로 필터링된 행과 열에 대해 차후 포스팅할 sklearn 등과 같은 통계 분석 라이브러리를 이용하여 유의미한 인사이트를 발견하는 과정이 포함되기 때문이다.
이러한 과정을 EDA라고 부르며, 이러한 분석을 바탕으로 데이터를 정제해 머신러닝/딥러닝 모델에 활용된다.
조회는 대표적으로 loc(), iloc() 함수가 존재하며, 이 중에서도 가장 많이 사용되는 loc() 함수에 대해 구체적으로 살핀다.
마지막 챕터에서는 Summary로 정리한 테이블을 공유한다.
Series(시리즈) 이해
데이터프레임과 더불어 Pandas가 제공하는 자료구조 중 하나이다.
인덱스와 값으로 구성되어 키와 값으로 구성되는 딕셔너리와 유사하다.
열이 하나뿐이므로, 열의 의미가 없어 그냥 값이라 부른다.
객체 정보, 일부 데이터, 집계 결과가 시리즈 형태를 갖는 경우가 많다.
Series vs DataFrame
시리즈는 하나의 열(변수)를, 데이터프레임은 여러 열을 가진다.
즉, 변수(열)이 단일인지 복합인지에 따라 자료구조가 결정된다고 봐도 무방하다.
데이터프레임 조회
# loc() 함수 구조
df.loc[시작행:끝행, ['열1', '열2', ...]]
df.loc[시작행:끝행, '열1':'열n']
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html
pandas.DataFrame.loc — pandas 2.3.0 documentation
A slice object with labels, e.g. 'a':'f'. Warning Note that contrary to usual python slices, both the start and the stop are included
pandas.pydata.org
이 함수만 제대로 이해하면, 조회는 마스터했다고 생각하면 된다.
이제부터 행과 열로 조회하는 방법에 대해 알아보자.
특정 열 조회
# 특정 열 조회 함수 구조
df.loc[:, [열1, 열2, ...]]
인덱서에 해당되는 ':'부분은 전체 행을 의미한다. 만약, 전체 행 ':'을 선택한 경우는 다음과 같이 인덱스 생략이 가능하다.
# 여러 열
df[[열1, 열2, ...]]
# 한개의 열
df[열1]
또한, 조회할 열이 하나면 리스트 형태가 아니어도 된다. (결과: Series)
그렇다면, 사용 예제를 보도록 하자.
# total 열 조회(아래 코드로 갈수록 생략된 과정)
df[:, ['total']].head()
df[['total']].head()
df['total'].head()
# 2개 이상의 열 조회 (total, tip)
# 아래로 갈수록 생략되는 과정
df[:, ['total', 'tip']].head()
df[['total', 'tip']].head()
열 범위 조회(여러 열)
# 열 범위 조회 구조
df.loc[시작행:끝행, '시작열':'끝열']
범위는 하나만 지정할 수 있어 리스트가 될 수 없으므로, 대괄호를 사용하지 않는 점이 특정 열 조회와의 차이점이다.
python은 기본적으로 zero-base이기 때문에 끝열의 index-1까지만 내용이 포함되지만, loc()함수는 끝열의 index까지 포함된다는 점을 주의하자.
그렇다면, 사용 예제를 보도록 하자.
# 전체 행에 대해 sex ~ time 열을 상위 5개 행만 조회
df.loc[:, 'sex':'time'].head()
특정 행 및 여러 행 조회
# 특정 행 및 여러 행 함수 구조
df.loc[시작행:끝행, :]
df.loc[[행1, 행2, ...], :]
df.loc[[행1, 행2, ...]]
# 단일행이라면 다음과 같은 구조
df.loc[특정행, :]
df.loc[특정행]
# 예제1
df.loc[1, :]
df.loc[1]
# 예제2
df.loc[[1,3,5], :]
df.loc[[1,3,5]]
조건을 통한 필터링 조회
# 조건을 쓰는 함수 구조
df.loc[행을 필터링할 특정 열에 대한 조건식, ['열1', ...]]
# 많이 쓰는 구조
df.loc[조건식, :]
df.loc[조건식]
특정 열의 값에 어떤 조건을 부여해 필터링된 데이터프레임(행렬)을 조회할 수 있다.
보통은 열을 지정하는 인덱서를 생략 후 필터링을 진행하고, 반환된 데이터프레임을 슬라이싱하는 등으로 사후처리를 진행한다. (추후 포스팅 예정)
그렇다면, 예제와 함께 조건 필터링을 사용하는 방법에 대해 알아보자.
# 단일 조건을 만족하는 행 조회
# tip 열 값이 6.0보다 큰 행 조회
df.loc[df['tip'] > 6.0]
# 여러 조건을 만족하는 행 조회
# & 또는 |(키보드: 달러) 연산자를 사용하고, 각 조건은 소괄호로 묶음.
# and로 여러 조건 연결
# tip 열 값이 6.0보다 크고, day 열 값이 Sat인 경우
df.loc[(df['tip'] > 6.0]) & (df['day'] == 'Sat')]
# or로 여러 조건 연결
# tip 열 값이 6.0보다 크거나, day 열 값이 Sat인 경우
df.loc[(df['tip'] > 6.0]) | (df['day'] == 'Sat')]
여러 조건을 만족할 떄, and와 or을 나타내는 &와 | 연산자 말고 편리한 isin(), between() 함수를 사용할 수도 있다.
# 값 나열 구조
# 값1 또는 값2 또는...값n인 데이터만 조회
df.loc[df['열'].isin([값1, 값2, ...])]
# 범위 지정 구조
# 값1 ~ 값2까지 범위안의 데이터만 조회
df.loc[df['열']].between(1,3)
# 값 나열
df.loc[df['day'].isin(['Sat', 'Sun'])]
# 범위 지정
df.loc[df['size'].between(1, 3)]
Summary 정리
조회 | 코드 예 |
특정 열 | df.loc[:, 'score'] → df['score'] |
여러 열 | df.loc[:, ['name', 'score']] → df[['name', 'score']] |
특정 행 | df.loc[1, :] → df.loc[1] |
여러 행 | df.loc[[1, 3, 5], :] → df.loc[[1, 3, 5]] |
특정 조건 | df.loc[df['score'] >= 80, :] → df.loc[df['score'] >= 80] |
여러 조건 | df.loc[(df['score'] >= 80) & (df['age'] < 20), :] → df.loc[(df['score'] >= 80) & (df['age'] < 20)] |
여러 조건 특정 열 | df.loc[(df['score'] >= 80) & (df['age'] < 20), ['name', 'age', 'score']] |
between() | df.loc[df['score'].between(80, 90), :] → df.loc[df['score'].between(80, 90)] |
isin() | df.loc[df['grp'].isin(['A1', 'B3', 'C1']), :] → df.loc[df['grp'].isin(['A1', 'B3', 'C1'])] |
- 굵게 표시된 코드 형태로 조회하되, 원래 코드가 무엇인지 꼭 아는 것을 추천
- 조건 조회 시 열 정보가 생략되면, loc를 생략 가능하나 생략하지 않기를 권고
- df['score']를 df.score로 작성 가능하나, df['score'] 형태로 사용하기를 권고
'Study > Machine Learning, Deep Learning' 카테고리의 다른 글
[데이터 처리 #0] DataFrame Overview (0) | 2025.06.17 |
---|---|
[데이터 처리 #4] DataFrame 변경 (0) | 2025.06.16 |
[데이터 처리 #2] DataFrame 탐색 (1) | 2025.06.16 |
[데이터 처리 #1] DataFrame 만들기 (1) | 2025.06.16 |