Pandas 데이터프레임

Tip학습 목표
  • Pandas 데이터프레임에서 특정 위치나 레이블을 사용하여 값을 선택할 수 있습니다.
  • 데이터프레임의 행과 열을 슬라이싱하여 부분집합(subset)을 추출할 수 있습니다.
  • 불리언(Boolean) 조건을 활용하여 특정 조건에 맞는 데이터를 필터링할 수 있습니다.
Note질문
  • 표 형태의 데이터를 어떻게 효율적으로 선택하고 분석할 수 있나요?

Pandas 데이터프레임(DataFrame)과 시리즈(Series)

  • 데이터프레임(DataFrame)은 Pandas에서 표(table) 형태의 데이터를 다루는 기본 구조입니다.
  • 시리즈(Series)는 데이터프레임의 각 열(column)을 나타내는 1차원 데이터 구조입니다.
  • Pandas는 Numpy 라이브러리를 기반으로 구축되어 강력한 수치 계산 능력을 제공하며, 인덱싱, 누락된 데이터 처리, 데이터 병합 등 데이터 분석에 최적화된 기능을 제공합니다.

데이터 선택하기

데이터프레임에서 특정 위치의 값을 선택할 때는 두 가지 방법을 주로 사용합니다.

  1. 위치 기반 선택 (iloc): 행과 열의 정수 인덱스(0, 1, 2…)를 사용하여 선택합니다.
  2. 레이블 기반 선택 (loc): 행 인덱스 이름과 열 이름을 사용하여 선택합니다.

위치 기반 선택: iloc

import pandas as pd
data = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
print(data.iloc[0, 0])  # 첫 번째 행, 첫 번째 열의 값 선택
1601.056136

레이블 기반 선택: loc

print(data.loc["Albania", "gdpPercap_1952"])  # 'Albania' 행, 'gdpPercap_1952' 열의 값 선택
1601.056136

행과 열 슬라이싱

  • :을 사용하면 해당 축의 모든 데이터를 선택합니다.
print(data.loc["Albania", :])  # 'Albania' 행의 모든 열 선택
print(data.loc[:, "gdpPercap_1952"])  # 'gdpPercap_1952' 열의 모든 행 선택
gdpPercap_1952    1601.056136
gdpPercap_1957    1942.284244
gdpPercap_1962    2312.888958
gdpPercap_1967    2760.196931
gdpPercap_1972    3313.422188
gdpPercap_1977    3533.003910
gdpPercap_1982    3630.880722
gdpPercap_1987    3738.932735
gdpPercap_1992    2497.437901
gdpPercap_1997    3193.054604
gdpPercap_2002    4604.211737
gdpPercap_2007    5937.029526
Name: Albania, dtype: float64
country
Albania                    1601.056136
Austria                    6137.076492
Belgium                    8343.105127
Bosnia and Herzegovina      973.533195
Bulgaria                   2444.286648
Croatia                    3119.236520
Czech Republic             6876.140250
Denmark                    9692.385245
Finland                    6424.519071
France                     7029.809327
Germany                    7144.114393
Greece                     3530.690067
Hungary                    5263.673816
Iceland                    7267.688428
Ireland                    5210.280328
Italy                      4931.404155
Montenegro                 2647.585601
Netherlands                8941.571858
Norway                    10095.421720
Poland                     4029.329699
Portugal                   3068.319867
Romania                    3144.613186
Serbia                     3581.459448
Slovak Republic            5074.659104
Slovenia                   4215.041741
Spain                      3834.034742
Sweden                     8527.844662
Switzerland               14734.232750
Turkey                     1969.100980
United Kingdom             9979.508487
Name: gdpPercap_1952, dtype: float64
  • 레이블을 사용하여 일정 범위를 슬라이싱할 수 있습니다. loc 슬라이싱은 마지막 레이블을 포함한다는 점에 유의하세요.
# 'Italy'부터 'Poland'까지의 행과 1962년부터 1972년까지의 열 선택
subset = data.loc['Italy':'Poland', 'gdpPercap_1962':'gdpPercap_1972']
print(subset)
             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country                                                    
Italy           8243.582340    10022.401310    12269.273780
Montenegro      4649.593785     5907.850937     7778.414017
Netherlands    12790.849560    15363.251360    18794.745670
Norway         13450.401510    16361.876470    18965.055510
Poland          5338.752143     6557.152776     8006.506993

조건부 필터링 (Boolean Masking)

  • 비교 연산자를 사용하면 데이터프레임의 각 요소에 대해 조건을 검사하고 True/False로 구성된 마스크를 생성합니다.
mask = subset > 10000
print(mask)
             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country                                                    
Italy                 False            True            True
Montenegro            False           False           False
Netherlands            True            True            True
Norway                 True            True            True
Poland                False           False           False
  • 이 마스크를 원본 데이터프레임에 적용하면 조건에 맞는 값만 추출할 수 있습니다. 조건에 맞지 않는 위치는 NaN(Not a Number, 결측치)으로 표시됩니다.
print(subset[mask])
             gdpPercap_1962  gdpPercap_1967  gdpPercap_1972
country                                                    
Italy                   NaN     10022.40131     12269.27378
Montenegro              NaN             NaN             NaN
Netherlands     12790.84956     15363.25136     18794.74567
Norway          13450.40151     16361.87647     18965.05551
Poland                  NaN             NaN             NaN

그룹화(Group By)

groupby를 사용하면 특정 기준에 따라 데이터를 나누고, 각 그룹에 대해 통계량을 계산한 뒤 다시 결합하는 분석을 수행할 수 있습니다.

# 전체 평균보다 높은지 여부를 기준으로 그룹화하여 합계 계산
mask_higher = data > data.mean()
wealth_score = mask_higher.aggregate('sum', axis=1) / len(data.columns)
print(data.groupby(wealth_score).sum())
          gdpPercap_1952  gdpPercap_1957  gdpPercap_1962  gdpPercap_1967  \
0.000000    36916.854200    46110.918793    56850.065437    71324.848786   
0.333333    16790.046878    20942.456800    25744.935321    33567.667670   
0.500000    11807.544405    14505.000150    18380.449470    21421.846200   
1.000000   104317.277560   127332.008735   149989.154201   178000.350040   

          gdpPercap_1972  gdpPercap_1977  gdpPercap_1982  gdpPercap_1987  \
0.000000    88569.346898   104459.358438   113553.768507   119649.599409   
0.333333    45277.839976    53860.456750    59679.634020    64436.912960   
0.500000    25377.727380    29056.145370    31914.712050    35517.678220   
1.000000   215162.343140   241143.412730   263388.781960   296825.131210   

          gdpPercap_1992  gdpPercap_1997  gdpPercap_2002  gdpPercap_2007  
0.000000    92380.047256   103772.937598   118590.929863   149577.357928  
0.333333    67918.093220    80876.051580   102086.795210   122803.729520  
0.500000    36310.666080    40723.538700    45564.308390    51403.028210  
1.000000   315238.235970   346930.926170   385109.939210   427850.333420  

Important연습 문제

데이터 선택 연습

  1. data_europe에서 ‘Serbia’ 국가의 ’2007년 1인당 GDP’를 선택하는 코드를 작성하세요.
  2. iloc[0:2, 0:2]loc['Albania':'Belgium', '1952':'1962']의 결과 차이를 설명해 보세요.
  1. data_europe.loc['Serbia', 'gdpPercap_2007']
  2. iloc은 마지막 인덱스를 포함하지 않지만, loc은 마지막 레이블을 결과에 포함합니다.
Important연습 문제

데이터 정제하기

다음 코드의 각 줄이 수행하는 작업을 설명해 보세요.

first = pd.read_csv('data/gapminder_all.csv', index_col='country')
second = first[first['continent'] == 'Americas']
third = second.drop('Puerto Rico')
fourth = third.drop('continent', axis = 1)
fourth.to_csv('result.csv')
  1. read_csv: 데이터를 읽어옵니다.
  2. first[...]: 대륙이 ’Americas’인 행만 필터링합니다.
  3. drop('Puerto Rico'): 특정 행을 삭제합니다.
  4. drop(..., axis=1): 특정 열을 삭제합니다.
  5. to_csv: 결과를 파일로 저장합니다.
Important연습 문제

메서드 찾아보기

dir(data)를 사용하여 데이터프레임에서 사용할 수 있는 메서드 목록을 확인해 보세요. 그중 중앙값을 계산하는 메서드는 무엇인가요?

중앙값을 계산하는 메서드는 median()입니다. data.median()으로 사용할 수 있습니다.

Important연습 문제

데이터 해석의 유의점

국경선이나 영토가 시간에 따라 변하는 국가(예: 폴란드)의 장기적인 GDP 데이터를 분석할 때 발생할 수 있는 문제점은 무엇일까요? 이를 해결하기 위해 어떤 고려가 필요할까요?

영토 변화는 인구와 경제 규모에 직접적인 영향을 미치므로 단순 수치 비교는 왜곡될 수 있습니다. 분석 시 역사적 맥락을 고려하거나, 1인당 GDP와 같은 상대적 지표를 활용하고 데이터의 한계를 명시해야 합니다.

Note핵심 요약
  • iloc은 위치(정수)를 기준으로, loc은 레이블(이름)을 기준으로 데이터를 선택합니다.
  • :를 사용하여 전체 범위를 지정하거나 슬라이싱을 수행할 수 있습니다.
  • 불리언 마스크를 사용하여 특정 조건에 맞는 데이터만 필터링할 수 있습니다.
  • NaN은 데이터가 없음을 나타내며, 통계 연산 시 자동으로 제외되는 경우가 많습니다.
  • groupby를 활용하면 데이터를 그룹별로 나누어 분석할 수 있습니다.