-
Pands 한번에 끝내기 01 - 데이터 과학의 핵심(인덱싱)빅데이터/Pandas 2022. 1. 19. 08:10
유투버 '이수안컴퓨터연구소'님 강의 참조
01 Pandas
- 관계 또는 레이블링 데이터로 쉽고 직관적으로 작업할 수 있도록 고안된 빠르고, 유연하고, 표현력이 뛰어난 데이터 구조를 제공하는 Python 패키지
- Pandas 특징
- 소수점이 아닌 데이터뿐만 아니라 부동 소수점 데이터에서도 결측 데이터 (NaN)을 쉽게 처리
- 크기 변이성(Size mutability): DataFrame으로 고차원 객체에서 열을 삽입 및 삭제 가능
- 자동 및 명시적 데이터 정렬 - 라벨로 정렬하거나 라벨을 무시하고 Series, DataFrame등의 계산에서 자동으로 조절 가능
- 데이터 세트에서 집계 및 변환을 위한 분할(split), 적용(apply), 결합(combine) 작업을 할 수 있는 'group-by' 함수 지원
- 누락된 데이터 또는 다른 Python 및 NumPy 데이터 구조에서 서로 다른 인덱싱 데이터를 DataFrame으로 쉽게 변환
- 대용량 데이터 세트의 지능형 라벨 기반 슬라이싱, 고급 인덱싱 및 부분집합 구하기 가능
- 플랫 파일(CSV 및 구분), Excel, 데이터베이스 로딩 및 초고속 HDF5형식의 데이터 저장/로드 가능
- 시계열 특정 기능: 날짜 범위 생성 및 주파수 변환, 무빙 윈도우 통계, 날짜 이동 및 지연 가능
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 * 슬라이싱 가능 * 조건을 걸어 출력 가능
- .loc/.iloc 관련 링크(https://azanewta.tistory.com/34) - .iloc는 잘 쓰지 않는다고 함.
- ['행', '열'] 순으로 조건을 검
- 다중 인덱싱
- 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)
'빅데이터 > Pandas' 카테고리의 다른 글
Pands 한번에 끝내기 03 - 데이터 과학의 핵심(문자열/시계열/데이터정제/파일 저장-열기) (0) 2022.01.20 Pands 한번에 끝내기 02 - 데이터 과학의 핵심(연산/결합/그룹화) (0) 2022.01.19