Pandas


파이썬의 데이터 구조 셋은 이미 잘갖추어져 있지만, pandas 모듈은 여기에 두가지 컨테이너인 Series와 DataFrame을 추가한다.

  • 시리즈는 레이블이 붙은 1차원 벡터다.
  • 프레임은 레이블이 붙은 행과 열로 구성된 테이블이다.
  • 프레임의 각 열은 시리즈다. 몇 가지 예외를 제외하면 pandas는 프레임을 시리즈와 유사하게 취급한다
  • 프레임과 시리즈는 다음과 같이 다양한 데이터 전처리함수를 가진다.
      - 단순 혹은계층적 인덱싱
      - 결측치 처리
      - 전체 열과 테이블에서 사칙 ,논리 연산
      - 데이터 베이스 - 타입연산 (결합이나 집계 등)
      - 단일 열이나 전체 테이블 시각화
      - 파일에서 데이터 읽고 쓰기

시리즈 : 1차원 벡터


import pandas as pd

series = pd.Series((2,3,2,6,4,1,2,3,45,1,2,3,4,2,-1,-2,))
print(len(series)) # 시리즈의 길이 
print(series)
16
0      2
1      3
2      2
3      6
4      4
5      1
6      2
7      3
8     45
9      1
10     2
11     3
12     4
13     2
14    -1
15    -2
dtype: int64

시리즈의 인덱스는 정수형이 기본값이다.


series.index.values
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15],
      dtype=int64)

프레임


레이블이 붙은 행과 열로 구성된 테이블

  • 데이터 프레임은 2차원 numpy 배열, 튜플로 구성된 리스트,파이썬 딕셔너리
    와 또 다른 데이터 프레임으로 생성 가능
import pandas as pd
alco2009 = pd.read_csv('./2020-08/excel/niaaa-report2009.csv',index_col="State")
alco2009.head()
  Beer Wine Spirits
State      
Alabama 1.20 0.22 0.58
Alaska 1.31 0.54 1.16
Arizona 1.19 0.38 0.74
Arkansas 1.07 0.17 0.60
California 1.05 0.55 0.73

데이터 모양 바꾸기


  • reset_index()와 set_index(column) 함수는 기존 인덱스를 떼어 내거나 새로운 인덱스를 만든다
  • 옵셔널 파라미터 inplace = True가 주어지면 기존 데이터 프레임 자체를 수정한다
alco2009.reset_index().head()
  State Beer Wine Spirits
0 Alabama 1.20 0.22 0.58
1 Alaska 1.31 0.54 1.16
2 Arizona 1.19 0.38 0.74
3 Arkansas 1.07 0.17 0.60
4 California 1.05 0.55 0.73
alco2009.reset_index().set_index("Beer").head()
  State Wine Spirits
Beer      
1.20 Alabama 0.22 0.58
1.31 Alaska 0.54 1.16
1.19 Arizona 0.38 0.74
1.07 Arkansas 0.17 0.60
1.05 California 0.55 0.73

재인덱싱

기존 데이터 프레임과 시리즈에서 행이나 열,행과 열을 추려서 새 데이터 프레임이나 시리즈를 생성한다

s_states = [state for state in alco2009.index if state[0]=='S']+["Samoa"]
print(s_states)

drinks = list(alco2009.columns)+['Water']
print(drinks)
nan_alco = alco2009.reindex(s_states, columns = drinks)
nan_alco
['South Carolina', 'South Dakota', 'Samoa']
['Beer', 'Wine', 'Spirits', 'Water']
  Beer Wine Spirits Water
State        
South Carolina 1.36 0.24 0.77 NaN
South Dakota 1.53 0.22 0.88 NaN
Samoa NaN NaN NaN NaN

스태킹과 피보팅


열 이름을 계층화 하는 대신 멀티인덱스의 전체 혹은 일부를 평평하게 할 수도 있다.
반대로 인덱스를 계층화 하는 대신 다층으로 구성된 열이름의 전체나 일부를 평평하게 할 수도 있다.

  • stack() 함수는 인덱스의 레벨 개수를 증가시키는 동시에 열 이름의 레벨 개수를 감소 시킨다**
  • unstack() 함수는 인덱스 레벨 개수를 낮추고 열 이름의 레벨 개수를 높인다.
  • pivot(index,columns,values) 함수는 기존 데이터 프레임을 새로운 데이터 프레임으로 변환.
  • 그 과정에서 index로 넘기는열을 새로운 인덱스로 사용하고 ,columns를 새로운 열 이름 리스로 사용하며 values 에 해당하는 열은 데이터 프레임을 채우는 데이터로 사용한다.
alco = pd.read_csv("./2020-08/excel/niaaa-report.csv",index_col=["State","Year"])
alco
    Beer Wine Spirits
State Year      
Alabama 1977 0.99 0.13 0.84
1978 0.98 0.12 0.88
1979 0.98 0.12 0.84
1980 0.96 0.16 0.74
1981 1.00 0.19 0.73
... ... ... ... ...
Wyoming 2005 1.21 0.23 0.97
2006 1.47 0.23 1.05
2007 1.49 0.23 1.10
2008 1.54 0.23 1.12
2009 1.45 0.22 1.10

1683 rows × 3 columns

#스태킹
print(alco)
tall_alco=alco.stack()
print(tall_alco)
              Beer  Wine  Spirits
State   Year                     
Alabama 1977  0.99  0.13     0.84
        1978  0.98  0.12     0.88
        1979  0.98  0.12     0.84
        1980  0.96  0.16     0.74
        1981  1.00  0.19     0.73
...            ...   ...      ...
Wyoming 2005  1.21  0.23     0.97
        2006  1.47  0.23     1.05
        2007  1.49  0.23     1.10
        2008  1.54  0.23     1.12
        2009  1.45  0.22     1.10

[1683 rows x 3 columns]
State    Year         
Alabama  1977  Beer       0.99
               Wine       0.13
               Spirits    0.84
         1978  Beer       0.98
               Wine       0.12
                          ... 
Wyoming  2008  Wine       0.23
               Spirits    1.12
         2009  Beer       1.45
               Wine       0.22
               Spirits    1.10
Length: 5049, dtype: float64
#언스태킹
print(alco.head())
wide_alco = alco.unstack()
print(wide_alco.head())
              Beer  Wine  Spirits
State   Year                     
Alabama 1977  0.99  0.13     0.84
        1978  0.98  0.12     0.88
        1979  0.98  0.12     0.84
        1980  0.96  0.16     0.74
        1981  1.00  0.19     0.73
            Beer                                                        ...  \
Year        1977  1978  1979  1980  1981  1982  1983  1984  1985  1986  ...   
State                                                                   ...   
Alabama     0.99  0.98  0.98  0.96  1.00  1.00  1.01  1.02  1.06  1.09  ...   
Alaska      1.19  1.39  1.50  1.55  1.71  1.75  1.76  1.73  1.68  1.68  ...   
Arizona     1.70  1.77  1.86  1.69  1.78  1.74  1.62  1.57  1.67  1.77  ...   
Arkansas    0.92  0.97  0.93  1.00  1.06  1.03  1.03  1.02  1.03  1.06  ...   
California  1.31  1.36  1.42  1.42  1.43  1.37  1.37  1.38  1.32  1.36  ...   

           Spirits                                                        
Year          2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  
State                                                                     
Alabama       0.51  0.53  0.53  0.52  0.52  0.53  0.55  0.56  0.58  0.58  
Alaska        0.92  0.97  1.08  0.79  0.96  0.99  1.02  1.07  1.09  1.16  
Arizona       0.71  0.70  0.69  0.71  0.70  0.74  0.78  0.76  0.75  0.74  
Arkansas      0.53  0.53  0.53  0.56  0.58  0.58  0.59  0.60  0.60  0.60  
California    0.64  0.64  0.63  0.65  0.67  0.68  0.70  0.72  0.72  0.73  

[5 rows x 99 columns]
#피보팅 pivot(index,columns,values) : 스태킹과 언스태킹의 더 일반화된 연산
alco = pd.read_csv("./2020-08/excel/niaaa-report.csv")

alco.pivot("Year","State","Wine").head()

ariz1623