데이터 세트 순회하기

Tip학습 목표
  • 여러 파일 이름을 한꺼번에 지정할 수 있는 글로빙(globbing) 패턴을 이해하고 사용합니다.
  • glob 라이브러리를 사용하여 조건에 맞는 파일 목록을 생성합니다.
  • 파일 목록을 바탕으로 for 루프를 사용하여 여러 파일에 대해 동일한 작업을 일괄 처리하는 코드를 작성합니다.
Note질문
  • 여러 개의 데이터 파일을 한 번에 처리하려면 어떻게 해야 하나요?

파일 이름 목록을 사용하여 for 루프로 파일을 일괄 처리합니다.

  • 파일 이름은 문자열 데이터입니다.
  • 파이썬 리스트를 사용하여 여러 파일 이름을 저장하고 관리할 수 있습니다.
import pandas as pd
for filename in ['data/gapminder_gdp_africa.csv', 'data/gapminder_gdp_asia.csv']:
    data = pd.read_csv(filename, index_col='country')
    print(filename, data.min())
data/gapminder_gdp_africa.csv gdpPercap_1952    298.846212
gdpPercap_1957    335.997115
gdpPercap_1962    355.203227
gdpPercap_1967    412.977514
gdpPercap_1972    464.099504
gdpPercap_1977    502.319733
gdpPercap_1982    462.211415
gdpPercap_1987    389.876185
gdpPercap_1992    410.896824
gdpPercap_1997    312.188423
gdpPercap_2002    241.165876
gdpPercap_2007    277.551859
dtype: float64
data/gapminder_gdp_asia.csv gdpPercap_1952    331.0
gdpPercap_1957    350.0
gdpPercap_1962    388.0
gdpPercap_1967    349.0
gdpPercap_1972    357.0
gdpPercap_1977    371.0
gdpPercap_1982    424.0
gdpPercap_1987    385.0
gdpPercap_1992    347.0
gdpPercap_1997    415.0
gdpPercap_2002    611.0
gdpPercap_2007    944.0
dtype: float64

glob.glob을 사용하여 패턴에 일치하는 파일들을 찾습니다.

  • 유닉스(Unix) 시스템에서 “글로빙(globbing)”은 특정 패턴과 일치하는 파일 집합을 찾는 것을 의미합니다.
  • 가장 흔히 사용되는 패턴 기호는 다음과 같습니다:
    • * : 0개 이상의 임의의 문자와 일치하는 와일드카드.
    • ? : 정확히 하나의 문자와 일치하는 기호.
  • 파이썬의 표준 라이브러리인 glob 모듈은 이러한 파일 패턴 매칭 기능을 제공합니다.
  • glob.glob('*.txt')와 같이 실행하면 현재 디렉터리에서 확장자가 .txt인 모든 파일의 목록을 리스트 형태로 반환합니다. 만약 일치하는 파일이 없다면 빈 리스트를 반환합니다.
import glob
print('data 디렉터리 안의 모든 csv 파일:', glob.glob('data/*.csv'))
data 디렉터리 안의 모든 csv 파일: ['data/asia_gdp_per_capita.csv', 'data/gapminder_gdp_europe.csv', 'data/gapminder_gdp_africa.csv', 'data/gapminder_gdp_oceania.csv', 'data/gapminder_gdp_americas.csv', 'data/gapminder_gdp_asia.csv', 'data/gapminder_all.csv']
print('모든 PDB 파일:', glob.glob('*.pdb'))
모든 PDB 파일: []

globfor 루프를 결합하여 여러 파일을 일괄(batch) 처리합니다.

  • 파일들이 일관된 규칙에 따라 이름 지어져 있다면, 간단한 패턴만으로 원하는 파일들을 쉽게 찾아내어 처리할 수 있습니다.
for filename in glob.glob('data/gapminder_*.csv'):
    data = pd.read_csv(filename)
    print(filename, data['gdpPercap_1952'].min())
data/gapminder_gdp_europe.csv 973.5331948
data/gapminder_gdp_africa.csv 298.8462121
data/gapminder_gdp_oceania.csv 10039.59564
data/gapminder_gdp_americas.csv 1397.717137
data/gapminder_gdp_asia.csv 331.0
data/gapminder_all.csv 298.8462121
  • 위 코드의 결과에는 지역별 데이터뿐만 아니라 gapminder_all.csv와 같은 전체 데이터 세트도 포함될 수 있습니다.
  • 특정 파일을 제외하거나 더 구체적인 대상을 지정하려면 패턴을 더 정교하게 작성해야 합니다.
  • 전체 통합 데이터의 최솟값이 특정 지역 데이터의 최솟값과 일치하는지 확인하는 것은 코드가 올바르게 작동하는지 검증하는 좋은 방법이 될 수 있습니다.
Important연습 문제

매칭되는 파일 판별하기

다음 파일 중에서 glob.glob('data/*as*.csv') 패턴에 일치하지 않는 파일은 무엇인가요?

  1. data/gapminder_gdp_africa.csv
  2. data/gapminder_gdp_americas.csv
  3. data/gapminder_gdp_asia.csv

1번 data/gapminder_gdp_africa.csv 파일은 이름에 as가 포함되어 있지 않으므로 패턴에 일치하지 않습니다.

Important연습 문제

최소 레코드 수 찾기

아래 프로그램을 수정하여, 데이터의 행(레코드) 수가 가장 적은 파일의 행 수를 출력하도록 만드세요.

import glob
import pandas as pd
fewest = ____
for filename in glob.glob('data/*.csv'):
    dataframe = pd.____(filename)
    fewest = min(____, dataframe.shape[0])
print('가장 작은 파일의 레코드 건수는', fewest, '건입니다')

참고: DataFrame.shape 속성은 데이터프레임의 (행 수, 열 수)를 담은 튜플을 반환합니다.

import glob
import pandas as pd
fewest = float('Inf')
for filename in glob.glob('data/*.csv'):
    dataframe = pd.read_csv(filename)
    fewest = min(fewest, dataframe.shape[0])
print('가장 작은 파일의 레코드 건수는', fewest, '건입니다')

fewest 변수를 초기화할 때 임의의 큰 숫자를 사용할 수도 있지만, 데이터가 그보다 더 클 경우 오류가 발생할 수 있습니다. 파이썬에서는 양의 무한대(positive infinity)를 나타내는 float('Inf')를 사용하여 어떤 수와 비교해도 안전하게 초기화할 수 있습니다.

Important연습 문제

여러 데이터 비교 및 시각화하기

모든 지역별 GDP 데이터를 읽어 들여, 각 지역의 연도별 1인당 GDP 평균 변화 추이를 하나의 차트에 그래프로 나타내는 스크립트를 작성해 보세요. 참고: 데이터프레임 연산 시 숫자가 아닌 데이터가 포함되어 있으면 오류가 발생할 수 있으므로, 숫자 데이터만 선택하여 계산해야 합니다.

파일 이름에서 지역명을 추출하여 범례(legend)로 사용하는 예시 코드입니다.

import glob
import pandas as pd
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1,1)
for filename in glob.glob('data/gapminder_gdp*.csv'):
    dataframe = pd.read_csv(filename)
    # 파일 이름 규칙이 'data/gapminder_gdp_<region>.csv'라고 가정합니다.
    # '_'를 기준으로 문자열을 나누고 마지막 부분에서 '.csv'를 제외하여 지역명을 추출합니다.
    region = filename.split('_')[-1][:-4]
    
    # 숫자 데이터만 사용하여 평균을 계산하고 그래프를 그립니다.
    dataframe.mean(numeric_only=True).plot(ax=ax, label=region)

ax.set_title('GDP Per Capita for Regions Over Time')
ax.set_xlabel('Year')
ax.set_ylabel('GDP Per Capita')
plt.legend()
plt.show()
Note파일 경로 다루기

파이썬의 pathlib 모듈을 사용하면 파일 경로, 확장자 분리 등 파일 시스템 조작을 더 쉽고 직관적으로 수행할 수 있습니다.

from pathlib import Path

p = Path("data/gapminder_gdp_africa.csv")
print(p.parent)  # 부모 디렉터리
print(p.stem)    # 파일 이름 (확장자 제외)
print(p.suffix)  # 확장자
data
gapminder_gdp_africa
.csv
Note핵심 요약
  • 파일 이름 리스트와 for 루프를 결합하여 여러 파일을 순차적으로 처리할 수 있습니다.
  • glob.glob을 사용하여 특정 패턴과 일치하는 파일 목록을 쉽게 가져올 수 있습니다.
  • globfor 루프를 함께 사용하면 대량의 파일을 효율적으로 일괄 처리할 수 있습니다.