ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Pands 한번에 끝내기 01 - 데이터 과학의 핵심(인덱싱)
    빅데이터/Pandas 2022. 1. 19. 08:10

    유투버 '이수안컴퓨터연구소'님 강의 참조

     

     

     

     

    01 Pandas

    • 관계 또는 레이블링 데이터로 쉽고 직관적으로 작업할 수 있도록 고안된 빠르고, 유연하고, 표현력이 뛰어난 데이터 구조를 제공하는 Python 패키지 

    - Pandas 특징

    1. 소수점이 아닌 데이터뿐만 아니라 부동 소수점 데이터에서도 결측 데이터 (NaN)을 쉽게 처리
    2. 크기 변이성(Size mutability): DataFrame으로 고차원 객체에서 열을 삽입 및 삭제 가능
    3. 자동 및 명시적 데이터 정렬 - 라벨로 정렬하거나 라벨을 무시하고 Series, DataFrame등의 계산에서 자동으로 조절 가능
    4. 데이터 세트에서 집계 및 변환을 위한 분할(split), 적용(apply), 결합(combine) 작업을 할 수 있는 'group-by' 함수 지원
    5. 누락된 데이터 또는 다른 Python 및 NumPy 데이터 구조에서 서로 다른 인덱싱 데이터를 DataFrame으로 쉽게 변환
    6. 대용량 데이터 세트의 지능형 라벨 기반 슬라이싱, 고급 인덱싱 및 부분집합 구하기 가능
    7. 플랫 파일(CSV 및 구분), Excel, 데이터베이스 로딩 및 초고속 HDF5형식의 데이터 저장/로드 가능
    8. 시계열 특정 기능: 날짜 범위 생성 및 주파수 변환, 무빙 윈도우 통계, 날짜 이동 및 지연 가능

     

     

    02 판다스 객체

     

    - Series

    import numpy as np
    import pandas as pd
    
    #Series 객체
    s = pd.Series([0, 0.25, 0.5, 0.75, 1.0])
    s
    
    0    0.00
    1    0.25
    2    0.50
    3    0.75
    4    1.00
    dtype: float64
    
    
    #인덱스 조절 가능
    s = pd.Series([0, 1, 2], index=['a','b','c'])
    s
    
    a    0
    b    1
    c    2
    dtype: int64
    
    *인덱싱/슬라이싱 모두 가능 (s[2:], s['b']....)
    # .unique() - 유니크 엘리멘트 찾음
    # .value_counts() - 엘리멘트 수 카운트
    # .isin() - 엘리멘트 위치 찾음
    
    
    pop_tuple = {'Seoul':9720846,
                'Busan':3045152,
                'Incheon':1234512,
                'Daejeon':4845311}
    
    population = pd.Series(pop_tuple)
    population
    
    Seoul      9720846
    Busan      3045152
    Incheon    1234512
    Daejeon    4845311
    dtype: int64
    
    
    population['Seoul']
    
    9720846

     

    - DataFrame

    # DataFrame 객체 - Series는 단일 객체, DF는 여러 차원의 객체를 가질 수 있음
    # NaN의 처리에 대한 강력함이 있음
    
    pd.DataFrame([{'A':2,'B':4,'D':3},{'A':4,'B':5,'C':7}])
    
    
    	A	B	D	C
    0	2	4	3.0	NaN
    1	4	5	NaN	7.0
    
    
    # Columns 및 Index 조절 가능
    pd.DataFrame(np.random.rand(5,5),
                columns = ['A','B','C','D','E'],
                index=[1,2,3,4,5])
                
    	A		B		C		D		E
    1	0.435977	0.151435	0.352285	0.168848	0.740820
    2	0.625244	0.457213	0.521676	0.551603	0.650211
    3	0.639364	0.911205	0.833160	0.505742	0.434824
    4	0.199707	0.538066	0.378287	0.761199	0.317241
    5	0.239708	0.094503	0.617547	0.172979	0.675599
    
    
    male_tuple = {'Seoul':1111,
                'Busan':2222,
                'Incheon':3333,
                'Daejeon':4444}
    male = pd.Series(male_tuple)
    
    female_tuple = {'Seoul':2222,
                'Busan':1111,
                'Incheon':4444,
                'Daejeon':1111}
    female = pd.Series(female_tuple)
    
    korea_df = pd.DataFrame({'남자 인구수':male, '여자 인구수':female})
    korea_df
    
    	남자 인구수	여자 인구수
    Seoul		1111	2222
    Busan		2222	1111
    Incheon		3333	4444
    Daejeon		4444	1111
    
    
    # DF도 인덱싱/슬라이싱 가능 함
    # .index - 인덱스 정보 
    # .columns - 컬럼 정보 (korea_df['여자 인구수'])

     

    - Index

    # Index 객체 - 인덱스를 써서 객체를 가져 올 수 있음
    idx = pd.Index([2,4,6,8,10])
    print(idx.size)
    print(idx.shape)
    print(idx.ndim)
    print(idx.dtype)
    print(idx[::2])

    인덱스 객체의 연산자들로 연산이 가능함

    idx = pd.Index([1,2,3])
    idx2 = pd.Index([4,5,6])
    print(idx.append(idx2))
    print(idx.difference(idx2))
    
    Int64Index([1, 2, 3, 4, 5, 6], dtype='int64')
    Int64Index([1, 2, 3], dtype='int64')

     

     

     

     

    03 인덱싱

    s = pd.Series([0,2,4,6,8], index=['A','B','C','D','E'])
    
    s.keys() # 인덱스 값 출력
    Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
    
    list(s.items()) # 내용물 출력, 하지만 list를 붙여나 zip형태가 풀림
    [('A', 0), ('B', 2), ('C', 4), ('D', 6), ('E', 8)]
    
    s['F'] = 10
    s
    
    A     0
    B     2
    C     4
    D     6
    E     8
    F    10
    dtype: int64
    
    * 슬라이싱 가능
    * 비교 형식으로 출력 가능

     

    - Series 인덱싱

    s = pd.Series(['A','B','C'], index=[1,3,5])
    s
    
    1    A
    3    B
    5    C
    dtype: object
    
    s[1]
    'A'
    
    s.iloc[1] # .iloc['정수값'] = 위치 정수를 기반으로 인덱싱 함
    'B'
    
    s.iloc[2]
    'C'
    
    s.iloc[0:2]
    1    A
    3    B
    dtype: object
    
    s.reindex(range(10))
    0    NaN
    1      A
    2    NaN
    3      B
    4    NaN
    5      C
    6    NaN
    7    NaN
    8    NaN
    9    NaN
    dtype: object
    
    s.reindex(range(10), method='bfill')
    0      A
    1      A
    2      B
    3      B
    4      C
    5      C
    6    NaN
    7    NaN
    8    NaN
    9    NaN
    dtype: object

     

     

    - DF 인덱싱

    korea_df['남여 비율'] = (korea_df['남자 인구수'] * 100 / korea_df['여자 인구수'])
    korea_df
    
    
    	남자 인구수	여자 인구수	남여 비율
    Seoul		1111	2222	50.0
    Busan		2222	1111	200.0
    Incheon		3333	4444	75.0
    Daejeon		4444	1111	400.0
    
    korea_df.values[0]
    array([1111., 2222.,   50.])
    
    korea_df.T
    	Seoul	Busan	Incheon	Daejeon
    남자 인구수	1111.0	2222.0	3333.0	4444.0
    여자 인구수	2222.0	1111.0	4444.0	1111.0
    남여 비율	50.0	200.0	75.0	400.0
    
    korea_df.loc[:'Incheon', :'남자 인구수'] #.loc = 레이블이나 조건표현으로 선택
    	남자 인구수
    Seoul	1111
    Busan	2222
    Incheon	3333
    
    * 슬라이싱 가능
    * 조건을 걸어 출력 가능

     

    - 다중 인덱싱

    • 1/2차원을 넘어 3차원/4차원 이상의 데이터 처리시 사용
    • 인덱싱/슬라이싱/조건 모두 가능
    idx_tuples = [('Seoul', 2010), ('Seoul', 2020),
                 ('Busan', 2010), ('Busan', 2020),
                  ('Daejeon', 2010), ('Daejeon', 2020),
                  ('Daegu', 2010), ('Daegu', 2020),
                  ('Incheon', 2010), ('Incheon', 2020)
                 ]
    idx_tuples
    
    [('Seoul', 2010),
     ('Seoul', 2020),
     ('Busan', 2010),
     ('Busan', 2020),
     ('Daejeon', 2010),
     ('Daejeon', 2020),
     ('Daegu', 2010),
     ('Daegu', 2020),
     ('Incheon', 2010),
     ('Incheon', 2020)]
     
    pop_tuples = [10312545, 9720846, 2567910, 3404423, 2758296, 2947217, 2511676, 2427954, 1503664, 1471040]
    population = pd.Series(pop_tuples, index=idx_tuples)
    population
    
    (Seoul, 2010)      10312545
    (Seoul, 2020)       9720846
    (Busan, 2010)       2567910
    (Busan, 2020)       3404423
    (Daejeon, 2010)     2758296
    (Daejeon, 2020)     2947217
    (Daegu, 2010)       2511676
    (Daegu, 2020)       2427954
    (Incheon, 2010)     1503664
    (Incheon, 2020)     1471040
    dtype: int64
    
    * midx = pd.MultiIndex.from_tuples(idx_tuples)
      population = population.reindex(midx)

     

     

Designed by Tistory.