파이썬
- 변수와 Namespace 메모리
- Namespace 에 사용하는 name(변수명, 함수명, class명, method명, module 명 등) 들이 저장되며, reference 에 name의 주소가 저장된다.
- name binding
- name의 reference 영역에 객체의 id를 저장하여 객체를 연결시키는 과정
- assignment( =), augmented assignment(*=, +=, -=,...), class method function 정의, import 할 때 발생
- del name을 통해 지울 수 있다.
- id(name) 을 통해 실제 메모리 값 접근
- Identifier
- 변수명 등 식별자
- interpreter 는 identifier를 발견하면 namespace에서 탐색한다
- 읽기 - local namespace -> global -> built-in
- 쓰기 - 현재 namespace 만
- 수치형 Numeric Type
- 정수형 integral
- 정수 integer, _로 자리 구분(3.6부터)
- default 10진
- 2진 0b ~
- 8진 0o~
- 16진 0x ~
- 부울 bool
- True
- False - 0, 0.0, '', None
- 정수 integer, _로 자리 구분(3.6부터)
- 실수형 floating point, _로 자리 분
- 3.1
- 3e4
- 복소수 complex
- a+bj
- 정수형 integral
- 문자열 String Type
- str - 문자열
- '', "", """ """, ''' '''
- string prefix
- r : raw
- 순문자열 그대로 저장
- f : formatted
- 대입 가능
- r : raw
- 타입 변환
- str()
- 정수를 문자열로 변환
- int(base=10)
- 문자열 -> 정수
- base 입력시 해당 진수로 번역해서 저장
- float()
- 문자열 -> 실수
- str()
- 입출력
- input()
- print()
- method
- split(sep=' ')
- 값 미설정시 공백 기준을 분리 후 문자열 리스트 반환
- '-'.join(li)
- s.find('l')
- s.upper,lower,strip
- split(sep=' ')
- 포맷화된 문자열 Formatted String
- 포맷 지시자와 %연산자
- C/C++ 형식
- '문자열' % (값1,값2,..)
- 문자열 %s, 문자 %c, 정수 %d, 실수 %f, 8진수 %o, 16진수 %x(X), # 진법표시 %인쇄 %%
- %(정렬 +-)(0으로 채우기)(숫자 폭)(. 정밀도)
- format() method
- "{idx (name): (채울문자, 정렬)(숫자 폭)(,표시)(.정밀도)(타입)}
- '{1:0>5.2f}'.format(0,1.234)
- = 01.23
- '{1:0>5.2f}'.format(0,1.234)
- {{}} - {}입력
- dict unpack **
- "{idx (name): (채울문자, 정렬)(숫자 폭)(,표시)(.정밀도)(타입)}
- 'f' string prefix
- f'{name}, {age}'
- 바로 변수명으로 사용 가능
- 사용법은 format() method와 동일
- f'{name}, {age}'
- 포맷 지시자와 %연산자
- bytes - 바이트
- str - 문자열
- Iterable Type
- Container
- 데이터의 주소들을 저장하는 slot 들의 집합인 객체
- 문자열 String
- s.upper(), s.lower()
- s.replace(o, n, count)
- s에서 o문자열 찾아서 n으로 count 만큼 (default -1 모두) 변경 새 문자열 반환
- sep.join(iterable)
- it item 하나의 문자열로 sep로 구분하여 새 문자열 반환
- s.split(sep, maxsplit)
- maxsplit 만큼 sep로 구분해서 잘라서 리스트로 반환, rsplit은 오른쪽부터
- s.splitlines(keepends=False)
- \n 등 line boundaries 만나면 구분, 리스트로 반환, keepends = True 면 line boundaries 제거안함
- s.strip(t), rstrip,lstrip
- t 에 포함된 문자를 만나면 삭제, 없는거 만나면 중지, default 는 공백, 새 문자열 반환
- s.swapcase()
- 대소문자 서로 변환
- s.title()
- 단어 시작마다 대문자
- s.capitalize()
- 첫 글자만 대문자
- s.center(w,f), s.ljust, l.rjust, s.zfill(w)
- w 길이로 변환한 문자열, 빈 공간 f로 채움, zfill 은 0으로 채움, w<s.length면 원래 문자열 반환
- s.find(t, start, end), rfind,
- s에서 t를 찾는 첫 글자 index 반환 없으면 -1 반환 (s.index는 error)
- s.startswith(t, st, end), s. endswith, s.count
- t로 시작되거나 끝나면 True, 혹은 개수
- 연속형 Sequence - 순서 o , index o
- 수정 불가형 immutable
- 문자열 str
- 튜플 tuple
- ()
- pack
- , 로 구분된 여러 개 값 자동생성
- t1 = (1,2,3); t2= 1,2,3 같음
- , 로 구분된 여러 개 값 자동생성
- unpack
- 여러 변수로 대입
- a,b,c = t1;
- 변수 개수 안맞으면 error
- * 키워드
- unpack 할 때 남은 모든 수 대입
- a, *b, c = t1;
- unpack 할 때 남은 모든 수 대입
- 여러 변수로 대입
- 바이트 bytes
- 수정 가능형 mutable
- 리스트 list
- []
- Method
- +, *
- extend(iterable) (item 꺼내서 저장)
- append(item) ( 그대로 저장)
- [] 접근 가능, slicing
- del (slot 축소)
- s.clear(slot 수 0)
- s.copy()
- s.reverse()
- 바이트 어레이 bytearray
- 리스트 list
- * , + 연산
- container 를 연결하여 새로운 객체 생성
- id 는 같기 때문에 하나 변경할시 해당하는 slot 변경됨(다중 참조)
- slicing 연산
- s[m:n] or s[m:n:k]
- slice 함수
- slice(start,stop,step) 가능 (생략 None)
- 수정 불가형 immutable
- 집합형 set - 순서 x, 개별 접근 x, 중복 x
- 수정 불가형 immutable
- 고정 집합 frozenset
- 수정 가능형 mutable
- 집합 set
- set() ( {} )
- item 으로 mutable(list,set,dict)불가
- method
- | 합집합
- & 교집합 (a&b&c ..)
- - 차집합
- ^disjoint
- add(x)
- remove(x) 없을시 error
- discard 없을시 error x
- pop() 임의 아이템 제거 및 반환, 없을시 error
- clear() 모두 제거
- copy() 얕은 복사
- 집합 set
- 수정 불가형 immutable
- 매핑형 mapping - 순서 x, key로 접근, key-value쌍
- 수정 가능형 mutable
- 사전 dict
- {}
- key 로 mutable (list, set, dict) 불가
- method
- dict.keys() 키 튜플
- dict.values() 값 튜플
- dict.items() key-value 튜플
- del d[key]
- d.pop(k,[default])
- key 가 k인 것 제거, 없을시 default 반환, default 없으면 error반환
- d.popitem()
- 마지막 item 반환 및 제거 없을 경우 error
- dict.fromkeys(it, obj)
- it -key , obj -value로 dict 생성
- 사전 dict
- 수정 가능형 mutable
- Container 변환 함수
- tuple(it)
- list(it)
- set(it)
- 중복 제거, mutable item x
- dict(it)
- (key,value) 쌍이어야 하고, key로 mutable x
- str(obj)
- object 타입이면 모두 가능
- Mutable Container
- Item 추가
- list
- l.append(item)
- l.insert(idx, item)
- set
- s.add(item)
- dict
- d['key'] = value
- 없으면 추가 있으면 갱신
- list
- Mutable - sequence type(list)method
- s.pop(m) = m번 index(default -1) 없으면 error
- s.remove(x) = s에서 x와 동일한 첫 번째 제거 없으면 error
- s.sort(*, reverse, key(비교함수))
- Item 추가
- Range
- 연속형 Sequence
- 수정 불가형 immutable
- range
- 생성규칙 저장(메모리 이득)
- range(start,stop, step)
- range
- 수정 불가형 immutable
- 연속형 Sequence
- Iterator
- 최적화에 유리, index x, item 꺼낼시 소진, container 로 변환해서 사용
- generator
- 식 (exp for target in iterable if exp1 if exp2 ... for target2 in iterable 2 if ...) - else는 불가, 연속으로 아이템 사용도 가능 (exp for y in x for z in y)
- Comprehensions - 편하고 빠름ㅋ
- generator 를 이용해 container 생성
- list - [generator], set - {g}, dict - {k:v}
- map(function, it, [..])
- function 의 파라미터 수 만큼 iterable 전달되어야함
- zip(*it)
- item 들을 튜플 쌍으로 반환 ( zip(x,y) 시 x,y item 하나씩 묶음
- 길이 다를시 가장 짧은 걸로
- filter([function], it)
- 결과가 True 인 item 목록 filter 타입 반환
- enumerate(it, [start=0])
- start 시작번호 지정
- idx, value 튜플 쌍 반환
- Built-in function
- item 존재 여부 판단
- x in it - item 중 하나가 같으면 true
- x not in it - item 중 하나가 x와 같으면 false
- max(it, [key, default] ), min
- key 함수 설정 가능(반환값 기준 판별)
- default - 빈 iterable 일 경우 반환값(x -> error)
- len(con)
- container의 item 개수
- sum(it, [start])
- start 부터 합산
- sorted(it, [key, reverse])
- key 함수 설정 가능(반환값 기준 정렬)
- reverse = True 면 내림차순
- Sequence Type Method
- s.index(x, [m [n]])
- m~n-1 사이 첫번째 x 인덱스, 없을시 error
- s.count(x)
- s 안에 x 개수, 없으면 0
- s.index(x, [m [n]])
- item 존재 여부 판단
- Container
- Built-in function
- abs(x)
- pow(v,e,[m])
- v 의 e 승, % m
- divmod(a,b)
- (a//b, a%b) 반환
- round(x, [d])
- d<=0
- 정수부 d 자리만큼 0, 반올림
- d > 0
- 소수부 d 자리에서 반올림
- 생략 or None
- 가장 가까운 정수
- d<=0
- oct(x), hex(x), bin(x)
- 각 prefix 8,16,2 진수 문자열로 변환
- chr(i)
- 번호 i에 대응되는 Uniconde 문자 반환(chr(65) = 'a')
- ord(c)
- 문자 c 에 대응되는 코드 번호 반환(Unicode)
- eval(exp,[ globals [ locals]])
- exp 문자열 수식을 계산.
- 식(expression) : 한 개의 객체로 eval 가능한 것
- globals, locals -> 변수들을 dict형식으로 전달
- exec(stp [globals[locals]])
- st 문을 계산
- 문 (statement) : executable 한 최소한의 코드
- 사용자 정의 함수
- def func(a1 : int, a2 : str) -> int: return x;
- 힌트 사용 가능
- call by assignment
- immutable 을 전달시 원본 값 변함 x (새 binding)
- mutable 전달시 원본 값 변함
- local namespace 로 넘어감
- 함수 내의 변수명들은 먼저 lns 에 등록이 되고 실행되면서 binding 됨
- b=a; a=0; 일 경우 아직 a는 비어있기 때문에 b에서 binding error(UnboundLocalError) 가 나온다.
- 함수 종료시 namespace 제거됨
- 호출 측에서 return object 의 id를 binding 하여 사용
- 함수 내의 변수명들은 먼저 lns 에 등록이 되고 실행되면서 binding 됨
- Global 키워드
- 전역 변수에 대한 쓰기 동작도 가능하게 해줌
- 없으면 생성 있으면 갱신
- nonlocal 키워드
- local 함수간 쓰기 공유 가능
- 예시
- def f(): a=20; def f1(): nonlocal a; def f2(): nonlocal a;
- 만약 상위 LNS 에 없는 변수명이면 에러
- Parameter
- pPK, pPKd ( 위치 키워드)
- aP(값만 전달)
- aK(keyword=value로 전달)
- ak 는 ap 뒤에만 올 수 있다.
- default 값(pPKd)는 오른쪽부터 채워야함
- pP (위치 전용)
- pK, pKd(키워드 전용)
- keyword로만 전달 받을 수 있고, * 이후의 모든 파라미터는 pK나 pKd이다
- def func(a,b, *, c,d=400,e); c부터는 pK라 default 아무데나 가능(순서 상관x)
- *pVP (가변- 위치)
- 0개 이상의 aP로 전달받음( 튜플)
- 반드시 하나만 사용 가능하며, pK 앞에 있어야하고, *pVP 앞에서는 pPKd 소용없음(0개 일때 제외)
- **pVK (가변- 키워드)
- dict 로 묶여서 전달됨 func(v1=1) 이면 **pVK는 {'v1':1} 로 전달받음
- pPK, pPKd ( 위치 키워드)
- 조건식
- true if exp else false
- 식만 사용가능하며 if 문에 비해 빠른 동작을 자랑한다.
- 반복문
- 다른건 c랑 동일 (iterable 넣는 것 좀 다르고)
- for 나 if 등 들여쓰기 블록은 별도의 namespace 생성 x
- for- else
- for 문이 break 나 return 처럼 강제로 안끝났을 때(정상적으로 끝났을 때) else문이 반드시 실행. 이거 편함 flag안써도되고
- while- else 마찬가지
- pandas
- 2009년말 오픈 소스 출범! 관계형 or 레이블 기반
- 시계열 Time Series
- 일정 시간 간격으로 배치된 날짜or시간 수열
- datetime
- 파이썬 표준 라이브러리
- from datetime import datetime
- datetime 끼리 차이를 구할 때 timedelta 객체 생성
- datetime(y,m,d,h,m,s)
- dt.strftime('%A. %m/%d')
- datetime 객체에서 요일 월/일 문자열화
- pandas의 시계열 data 유형
- read_csv(.., parse_dates=True)
- pd.Timestamp(input, freq, tz,..)
- datetime과 유사, 특정 날짜 시간을 의미하는 가장 기본적인 유형
- pd.Timestamp(15111111, unit='s')
- UTC인 1970-1-1 0:0:0 부터 경과시간을 초로 환산하여 더한 시간
- dt. (accessor) 로 접근, dt.year, dt.day, dt.is_month_start() 등
- pd.to_datetime(arg, format,...)
- arg를 datetime 으로 바꿔주며 arg는 웬만한건 다 알아먹음, 못알아 먹으면 format로 지정
- pd.date_range(start,end,periods,freq,...)
- start 부터 end 까지 혹은 start 부터 periods 번 만큼
- 인덱싱 가능
- sr['2021-1'] - 2021년1월꺼 모두
- sr['2021': '2022'] 2021~2022모두
- sr[sr.index.day<15], sr[sr.dt.day.between(1,10)
- pd.Timedelta
- 절대시간 기간(차이)
- pd.Period
- 특정 시점 및 주기로 정의된 시간 범위
- pd.DateOffset
- 달력 산술 고려 상대시간기간
- pd.DateOffset(n, normalize, **kwds)
- normalize = True면 시간 자정
- pd.offsets.Week(weekday=2)
- 1주일 단위 2일 기준(화욜?) offset 생성
- pd.DateOffset(months=2) 2달 후
- numpy 의 ndarray를 사용함
- 특징
- 1. Element-wise
- 배열간의 연산은 item끼리 자동으로 됨
- 2. Broadcasting
- Shape가 맞지 않는 경우 자동으로 통일
- 우측( 번호가 높은 쪽으로) align 한 후에 요소수 1로 생성한 후, 요소수 1인 배열을 상대축과 맞춤( (3,2)와 (2,) 계산시 (2,) => (1,2) => (3,2) 값은 복사
- 1. Element-wise
- axis
- 가장 나중에 추가된 축이 axis 0 차례대로 axis -1, axis -2...
- (2,3,4) 면 axis 0 1 2 ( -3 -2 -1) 임
- numpy.array(obj), numpy.arange([start,] stop,[step,])
- numpy.reshape()
- 특징
- Data Structure
- DataFrame
- row Index - df.index
- columns Index - df.columns
- values(2d array) - df.values
- Series
- Index - sr.index
- values(1d array) - sr.values
- name - sr.name
- Index
- values - i.values
- name - i.name
- DataFrame
- Method
- 추출
- df(sr).head(n)
- - n개 추출(음수=뒤에 n개 제외)
- df(sr).tail(n)
- - 뒤에서 n개 추출(음수 = 처음 n개 제외)
- df(sr).nlargest(n,col(sr x), keep) || nsmallest()
- - 가장 큰(작은) n개를 col 기준에 따라 keep (first ...) 로 꺼냄
- df.select_dtypes(include, exclude)
- dtype 이 include 에 속하고 exclude에 속하지 않은 것만 뽑아줌
- df/sr.pop(item)
- column 이나 index label 에 해당하는 아이템 뽑아줌( series 나 scalar 반환, 원본에서 삭제)
- df(sr).head(n)
- 정보확인
- obj.dtypes - DF의 컬럼별 데이터 타입
- obj.info() - DF 정보 요약 인쇄
- obj.ndim - 차원
- obj.shape - 차원 정보 tuple
- obj.size - 객체 요소 개수
- obj.memory_usage() - 메모리 사용 byte
- obj.dtype - .values 에 대한 데이터 타입
- obj.nbytes - .values의 총 바이트 수 반환
- df.count()
- df.value_counts() - df 유니크한 값들 개수
- 파일 읽고 쓰기
- read_csv(filename)
- to_csv(path_of_buf)
- to_excel(name, sheet_name)
- 복사
- df/sr.copy(deep=False) - 얕은 복사
- i.copy(name, deep, dtype) - index 복사
- df/sr.astype(dtype, copy, erros) - dtype 을 변경하여 복사본(copy=True) 반환
- upcasting 시 괜찮지만 불가능할 시 valuer error 발생, errors='ignore' 키워드 전달시 변경 가능한 type만 변경
- df1 = df.astype(object, errors='ignore')
- x={'age': np.int8, 'height':np.int16'}; df = df.astype(x) 로 여러개 한 번에 가능
- i.astype(dtype, copy)
- 생성자
- Series
- pd.Series(data, index, dtype,name,copy..)
- data = sr.values, index와 수 동일, scalr일 경우 broadcasting
- index 생략시 rangeindex로 대체
- 중복 참조 방지를 위한 copy=True
- pd.Series(data, index, dtype,name,copy..)
- DataFrame
- pd.DataFrame(data, index, columns, dtype, copy...)
- copy- data 가 ndarray 일 경우 복사 여부 (다중 참조 방지)
- dict 타입
- df = pd.DataFrame({'A':['kim','lee'], 'B':['asdf','sdf'] } )
- -> col A,B, idx 0,1,
- ndarray 타입
- df=pd.DataFrame([[1,2,3],[4,5,6]], index=[0,1], columns=['A','B'])
- -> col A,B, idx 0 ,1, 123, 456 생성
- df 타입
- df=pd.DataFrame(df, columns=['A', 'B','C'], index= [0,1,2])
- df에서 label 기반으로 abc, 012에 맞게 데이터 넣어줌 + 없는 label 은 NaN으로 채워줌
- pd.DataFrame(data, index, columns, dtype, copy...)
- Index
- pd.Index(data,dtype,name..)
- data - I.values 값(1D array-like)
- pd.RangeIndex(start,stop,step,name)
- int64Index 메모리 절약을 위한 특수한 타입
- pd.date_range(start,end,periods, freq)
- DatatimeIndex객체
- 시작일~ 종료일 or 시작일 + periods(전체 기간), freq = 시간 주기 지정 default = 'D'
- pd.date_range('2000-01-01', '2000-1-3', freq= '1H') -> 1시간 간격, 날짜 형식은 통상적으로 사용하는거면 상관 없음('01-31-2000' 등)
- indexing - s['2000-01'] 하면 2천년 1월에 해당하는 날짜 모두 나옴(오우 굿ㅋ)
- pd.Index(data,dtype,name..)
- Series
- Format 변환
- to_list, to_excel 등 검색 ㄱ
- index 및 name 변경
- df.rename(mapper, axis,index,columns,copy,inplace,errors)
- mapper - {컬럼명: 변경 후} + axis
- index, columns 에 함수 사용 가능
- inplace = True 일 경우 copy 무시되며 모두 원본
- inplace = False, copy= False 면 values 원본 copy=True면 전부 복사본
- sr.rename(index, axis, copy, inpllace, errors)
- sr.set_axis 로 index 변경 가능
- i.rename(name, inplace)
- df.add_prifix() || df.add_suffix()
- 앞이나 뒤에 글자 추가 가능(column only)
- df.set_index(keys, drop, append, inplace)
- 지정한 컬럼을 index로 지정, multi index가능
- drop=True 일경우 지정된 column index 설정 후 삭제
- append = True 일 경우 multi index
- df/sr.reset_index(level, drop, inplace)
- index 를 column으로 이동
- level은 multi index일 경우 사용, drop=True면 열로 추가 안됨
- df.reindex(labels, index, columns, axis,fill_value...)
- labels 에 새로운 index설정 - 기존에 없는 거면 fill_value로 채워서 새로 추가
- index, columns 면 label 별로 맞춰서 데이터 채워줌
- df/sr.sort_index(axis, ascending,kind..)
- 지정 축의 labels 를 정렬
- df/sr.sort_values(by, axis, ascending...)
- by- 정렬 기준 label 지정, list로 여러개 가능, 값으로 비교
- 타입 다를시 안됨. axis=0이면 행 정렬
- df.T || df.transpose()
- transpose
- df.rename(mapper, axis,index,columns,copy,inplace,errors)
- 컬럼 추가
- df.insert(loc columns, value, allow_duplicates)
- loc 위치번호로 column 이름으로 value data 채워줌
- df.columns.get_loc(label) 로 하면 직접 안구해도됨
- df.assign(**kwargs)
- 따옴표 쓰면 안됨
- df.assign( grade=3, sex=['W','M'], avg= lambda x : x['tot']/2) 처럼
- df.update(other, join, overwrite, filter_func..)
- other = df or df로 변환가능한 거
- overwrite true 면 모든 데이터 변경 false면 NA 데이터만 갱신
- filter_func boolean array 반환함수
- series를 넣을 경우, series 의 name = column label, series index = df.index
- df.insert(loc columns, value, allow_duplicates)
- 컬럼 삭제
- drop(labels, axis, index,columns,inplace..)
- 삭제할 index나 column list
- labels + axis=0 은 index와 마찬가지
- drop_duplicates(subset, keep, inplace...)
- 비교할 컬럼 label 과 유지할 행
- 중복행 삭제
- drop(labels, axis, index,columns,inplace..)
- Missing Data 처리
- pandas 에서는 기본적으로 np.nan을 사용
- NA 제거
- dropna(axis, how, inplace, thresh,...)
- how = 'any'면 na 한개라도 있으면 삭제
- thresh 3이면 na가 아닌게 3개 이상있어야 삭제 안함
- fillna(value, method, axis)
- method = 'bfill' , 'ffill' NA값 이전 or 이후 값으로 채움
- dict {'B': -1, 'C':-2} 로하면 B컬럼은 na를 -1 로 c는 -2로 채움
- replace(to_replace, value, inplace, regex,...)
- list 식
- df.replace([1,3], [-1,-2]) 일 경우 1->-1 , 3->-2 로 변경
- dict 식
- df.replace({'B':[1:-1, 3:-1}})
- B컬럼 1->-1, 3->-1
- df.replace('B':[1,3], 'C':[2,5]},-1)
- B 컬럼에서 1,3 ->-1
- df.replace({'B':3, 'C':1}, {'B':-2, 'C':-3})
- B컬럼 3 -> B컬럼 -2
- df.replace({'B':[1:-1, 3:-1}})
- list 식
- dropna(axis, how, inplace, thresh,...)
- 필터링
- 1.Indexing - 아래의 내용과 같음
- 2.boolean array, user-defined function
- df[ [True, False, ... ] ] => true만 행별로 추출 df
- df[ df['sex'] == M ]
- 연산결과가 boolean array형태의 'Series' 라서 index label 에 맞는 (True값) 행만 추출. df
- ==(eq()), !=(ne()), >(gt()), <(lt()), >=(ge()), <=(le()), ~, &, |, ^
- function 이름을 넣을시 df/sr[f2] df나 sr 자체가 전달됨
- df['name'].str.contains('a|i')
- bool array return
- df.isin([values]) , df.isna(), df.notna()...
- df 안에 values 있는지 여부 bool array로 반환
- {'name':['kim'], 'age':[30,40]} 등 열별 가능
- df.duplcated(subset,keep)
- 중복되는 행 bool array로 반환
- subset에 칼럼명, keep에 중복처리할 키워드
- 3.method
- 추출
- query(expr, inplace)
- df의 컬럼별 특정 행 추출
- 조건식을 문자열로 전달
- 파이썬 연산자도 사용 가능
- class 등이 컬럼명일 경우 ` 사용해서 표시
- 변수명 그대로 사용하고 싶을시 @붙여서 표시
- column명은 ' 없이 사용
- Nan 구분할때 'name!=name'사용-> nan은 비교연산 불가라 항상 위 식 결과가 true
- query(expr, inplace)
- 컬럼, 인덱스 추출
- filter(items(label) , like, regex, axis)
- 컬럼과 인덱스 필터링
- df.filter('indexname=='asdf'')
- df.filter('index== 'asdf''
- filter(items(label) , like, regex, axis)
- 함수 적용, 추출
- apply(func, args())
- 함수 실행 결과에 따라 sr: sr/scalar , df: sr/df 반환
- df일 경우 axis=0(default)면 컬럼 Series가 통째로 함수인자로 넘어감, sr일 경우 value들이 하나씩 넘어감( 한 단계 낮아졌다고 생각)
- result_type 은 axis=1(columns) 일 때만 적용된다.
- result_type= 'expand'
- list-like results 를 df 로 컬럼 확장
- 한번에여러컬럼 만들고 싶을 때
- result_type= 'broadcast'
- 원래 DataFrame 모양으로 br
- args는 ( ) 로 묶어서 추가적으로 전달 혹은 keyword로 넘김
- df['price'].apply('{:.2%]'.format)
- 소수 두 자리까지 percentage로 표현
- dict사용 불가( dic.get 으로 사용)
- pandas 함수는 문자열'' 로 전달
- applymap(func)
- df 각 항에 함수 모두 적용 후 반환
- map(arg, na_action)
- dict도 가능(apply와의 차이점)
- replace(arg)
- dict도 가능
- where(cond, other...)
- cond 가 true 면 유지, false 면 other로 변경
- boolean array 반환
- np.where(cond, 참값,거짓값)
- 참일때도 변환 가능
- mask(cond, other...)
- cond가 true 면 변경, false 면 other로 변경
- boolean array 반환
- apply(func, args())
- 추출
- Combining & merging
- 컬럼 또는 행연결
- concat(objs, axis, join, levels..)
- axis=0이면 append와 동일
- join = 'outer' 합집합 'inner' 교집합
- concat(objs, axis, join, levels..)
- 컬럼 병합
- join(other, on, how, lsuffix,...)
- 같은 index label 기준으로 병합, 컬럼 중복 불가
- on ='colname' 설정시 L.join(R)에서 L의 해당 컬럼과 R의 인덱스를 맞춰서 합침
- how = 'outer'설정시 합
- merge(other, how, on, sufficex,..)
- on으로 공통 컬럼명 지정
- 여러개 매칭되는 경우 n*m의 조합을 모두 저장
- join(other, on, how, lsuffix,...)
- 행연결
- append(other, ignore_index,verify_integrity, sort)
- 객체 행 끝에 other 추가한 새 객체 리턴
- ignore_index -> index reset
- verify_integrity -> index 중복 x
- df/sr 연결시 같은 컬럼에 맞춰 행단위로 연결함
- append(other, ignore_index,verify_integrity, sort)
- 컬럼 또는 행연결
- Reshape
- MultiIndex
- 계층구조로 이루어진 index 객체
- level 0부터 부여, -1이 가장 하위
- 다층일 경우 튜플 쌍으로 표현
- pd.MultiIndex(levels[['A','B'],['X','Y']], codes[[1,1,0,0],[1,0,1,0]], names=['L1','L2'])
- multi index level 0 name L1 = BBAA, level 1 name L2 YXYX
- df.xs('Y', axis=1, level=1, drop_level)
- multiindex 객체 인덱싱, key값으로 선택, drop_level=false면 self와 동일한 구조로 반환
- 재구성
- df.pivot(index, columns, values)
- df에서 index와 columns 로 사용할 열 지정, values 값 채움(defalut는 multiindex 컬럼으로 구성)
- columns 의 unique 값들이 column 으로 채워지므로, 여러 열을 한 번에 묶어서 전달하면 된다.
- df.melt(id_vars, value_vars, var_name,..)
- 컬럼으로 되어있는 값들을 행으로 재구성
- id_vars 제외한 나머지 행들 다 합치기 or value_vars[ ' ',...] 지정하여 데이터화 시키기, var_name으로 이름 지정, value_name으로 value 컬럼이름 지정
- stack(level), unstack(level, fill_value)
- stack = 컬럼 -> 인덱스
- unstack = 인덱스 -> 컬럼
- level default = -1 가장 밑에 추가
- 컬럼명 지정 혹은 level 지정
- df.pivot(index, columns, values)
- MultiIndex
- 집계
- Pivot Table
- 원하는 인덱스와 컬럼, 값들로 func를 적용하여 새로운 df 생성
- df.pivot_table(index, columns, values, aggfunc)
- aggfunc 의 결과를 col로 반환하지만 index 나 columns 에 쓰인 열을 같이 쓸 수 없다.
- aggfunc가 dict {'grade': 'count'} 같은 형태일 때, grade 가 멀티 인덱스로 구성되므로 droplevel을 붙여서 떼어주면 좋다.
- Group by
- 원하는 기준으로 그룹화, gb객체 반환
- Splitting -> Applying -> Combining
- df/sr.groupby(by, axis, level,sort,as_index...)
- df.groupby(['class','name'])
- class, name 멀티인덱스로 구성
- df.groupby(lambda x: '1~6' if x<7 else '7~12')
- index가 숫자일 때 그룹key로 반환
- df.groupby({1:'G1', 2:'G2'..})
- 인덱스 1이면 G1그룹
- df.groupby(list or ndarray)
- 선택한 축과 길이가 동일해야함 -> transform 활용
- 레벨, 이름 혼용 불가 -> df.groupby([pd.Grouper(level=0), 'mode'])
- df.groupby(['class','name'])
- groupby method
- gb.groups - dict객체 반환
- gb.get_group(key)- key에 해당하는 df or sr 반환
- gb.first(), last(), nth(n) - 추출
- gb.size() - 집계
- groupby 집계 method
- describe, min, max, ...
- gb.apply(func,...)
- 집계 메서드에 없는 기능의 함수 적용, 그룹별 df/sr 받음
- gb.agg(func,...)
- 컬럼별로 다른 함수 적용, df/sr 반환, 그룹별 df/sr 받음
- gb.transform(func,...)
- 원본과 동일한 크기로 결과 반환
- 그룹별 함수 적용, 그룹별 df/sr/ 받음
- fillna에 Series로 전달해서 index 맞춰서 채우는 용도로도 사용
- gb.filter(func, dropna=True)
- 그룹별 필터링해서 소그룹 추출
- gb에 저장된 인덱스로 접근해 DF 새로 구성해 반납
- Pivot Table
- 추출
- Indexing
- []
- Series
- sr[위치번호, label], sr[[1,2,..or 'a','b']]
- 숫자형 label은 숫자로 쳐야함
- sr[:] || sr[::]
- 위치번호, label 둘 다 가능 label일 경우 [] 위치 번호일 경우 [)
- sr[위치번호, label], sr[[1,2,..or 'a','b']]
- DataFrame
- df[] || df[['a','b','c'...]]
- column label (번호 x)
- df[:] || df[::]
- row label or 번호 (쓰지말자 헷갈려)
- df[] || df[['a','b','c'...]]
- Series
- loc[] || iloc[]
- loc 은 label , iloc 은 idex 기반
- : 전부, single index, list, slicing 가능
- df.loc[r_idx, c_idx] c_idx 생략가능
- loc 으로는 새로운 row,col 명으로 생성 가능 but iloc으로는 불가능
- Boolean indexing
- Boolean vector 로 필터링하여 추출, 혹은 Boolean 형태의 Series 로 인덱싱
- df[[False, True,...]]
- df[ df['sex'] == 'M' ]
- df.loc[ lambda x : x['sex'] == 'M' ]
- str.contains, str.endswith, str.startswith...
- isin([ ... ] )
- values 포함 여부 boolean array 반환
- all(), any(),
- duplicate() -> 중복 행 True 표시
- isna(), notna(),
- []
- 문자열처리
- series에 담긴 문자열 집합을 처리하는데 사용
- sr.str.match(regex)
- 정규식 일치 여부
- sr.str.findall(regex)
- 일치하는 패턴/정규식의 목록 리스트 반환
- sr.str.cat(sep=' ')
- 지정한 구분 기호로 연결
- sr.str.replace(to_replace, value)
- to -> value로 치환
- sr.str.extract(regex)
- 정규식 캡쳐 크룹을 DF로 추출
- sr.str.startswith(), sr.str.endswith()
- 시작하는 문자열 끝나는 문자열
- 그 외 python 문자열과 유사
- 정규식(Regular Expression , Regex)
- 메타 문자
- . -> 문자 한 개(\n 제외)
- ^x -> 문자열 시작이 x
- x$ -> 문자열 끝이 x
- x* -> x 0번 이상
- x+ -> x 1번 이상
- x? -> x 가 0 or 1
- x{n} -> x n번이상, x{n, k} -> n번이상k번 이하
- [abc] -> abc 중 하나 [a-zA-Z] 알파벳 전부
- (x) 그룹화
- 그룹화 번호마다 숫자가 붙어서 \1 로 사용
- r'(\w)\w\1'
- aba 처럼 첫번째꺼 마지막에 오게
- (?:x) 하면 패턴은 검사하나 캡쳐 x (번호 x)
- (?P<name>..) 그룹화하고 내용 캡쳐 후 그룸의 이름 지정
- (?P=name) 하면 저장한 이름 문자열 검색
- \x -> 특수문자 x 를 일반 문자로 \( -> '('
- 특수 시퀀스 문자(축약형 문자)
- \d -> 숫자 한 개, \D -> \d 아닌 문자
- \w -> 숫자+문자+_ -> \W \w 아닌 문자
- \s -> white space -> \S \s 아닌 문자
- \b -> 단어 경게 -> \B 비단어 경계 r'\b사람\b' 로 할 경우 사람 단어 따로 있는거 찾음
- 특수 시퀀스 문자(축약형 문자)
- pandas 에서 처리 .str 접근자
- s.str.match('.+(.com)$')
- findall
- cat
- replace
- extract -> df로 만들어줌
- 메타 문자
- 시각화
- matliblib.pyplot을 이용할 수도 있고, pandas 를 이용할 수도 있음
- df.plot(kind='bar'..)
- plt.pie(data, autopct='%1.1f%%' 소수점 1자리까지, explode=[] 가운데에서 떨어진정도, wedgeprops={'width':0.5} 가운데 텅빔)
- r2.style.background_gradient(cmap='summer') - 2차원 시각화 html
- 범주형 Categorical data
- 몇 개의 종류로 나눠지는 데이터[ 'a', 'b', 'c'] -> [0, 1, 2] -> 메모리 절약
- 카테고리간 우열 있을 시 비교 연산 가능
- .cat 접근자
- 객체 생성
- pd.Categorical(values, categories, ordered)
- values - data
- categories 로 카테고리 설정, 생략시 오름차순 정렬하여 자동 생성(unique value로 )
- pd.cut( x(1darraylike) , bins, right, labels)
- 숫자 데이터를 카테고리화
- right ( (a,b], True default)
- li=['bad,'good','best']
- df['bins'] = pd.cut(df['exam'], bins=3, labels=li) - 3구간으로 (최소, 최대 균일 분할)
- b = [-1,10,20,30] , bins=b일 경우 -1<x<=10, 10<x<=20, 20<x<=30 구간으로 구분
- pd.qcut()
- 균등 개수로 분할
- pd.crosstab(index, columns ,...)
- groupby 대상 지정 후 unique value로 df 구성, 단 columns 는 category 타입
- cut = pd.cut(df['age'], bins=b, labels=l)
- df['age'].groupby(cut).agg(['count', 'max'])
- pd.Categorical(values, categories, ordered)