티스토리 뷰
#. 색인 (.np.ix_, .iloc, .loc) *
# 슬라이스 색인 (얕은 복사, 원본 갱신)
- 1차원 : ar[n:m] # n~m-1
- 2차원 : arr[:2] # 행 우선 (n~1행)
arr[:2, 1:] # (n~1행, 1~m열)
# 다차원 색인
- arr[[1,5,3], [2,6,4]] # point 색인 (1,2), (5,6), (3,4)
- arr[[1,5,3], [:,[2,6,4]] # 1,5,3행의 2,6,4열
# np.ix_() 함수 색인
- arr[np.ix_([1,5,3], [2,6,4])] # 1,5,3행의 2,6,4열 (np.ix_ 함수 : 위치 값으로 전달)
# iloc[] 정수 색인
- df.iloc[0,:] # 0번째 행
- df.iloc[:,0] # 0번째 열
- df.iloc[[0,1],[0,1]] # 0~1행, 0~1열
- df.iloc[0:2,0:2]
# loc[] 이름, 조건 색인
- df.loc[:,'name'] # name 열
- df.loc[0,'name'] # 0행의 name열 (정수 조합 가능)
- df.loc[df.price > 1000,] # price행이 1000보다 큰 열
#. 계층적 색인 (.xs)
# xs() 색인 (axis=0, level=0 default)
0. 행 색인
- df.xs('r1') # 상위 행 r1 색인
- df.xs('rsub1', level=1) # 하위 행 rsub1 색인
- df.xs(('r1,'rsub1')) # 상위 행 r1의 하위 행 rsub1 색인
= df2.xs(r1).xs('rsub1')
1. 열 색인
- df.xs('c1', axis=1) # 상위 열 c1 색인
- df.xs('csub1', level=1, axis=1) # 하위 열 csub1 색인
- df.xs('c1', axis=1).xs('csub1', axis=1) # 상위 열 c1의 하위 열 csub1 색인
#. 전치 (.T, .swapaxes, .transpose) *
# 2차원
- arr.T # 행/열 전치
# 2, 3차원
- arr.swapaxes(1, 2) # 행/열 전치 => 두 축을 전달(순서 의미X), 얕은 복사
- arr.transpose((1,0,2)) # 층에는 행, 행에는 층, 열에는 열로 전치 => 층,행,열 순서로 전달, 얕은 복사
#. 정렬 (.sort_values) *
# 특정 행 정렬
- df.a.sort_values(ascending=False) # 컬럼 a의 데이터 내림차순 정렬
# 특정 행 기준 정렬
- df1.sort_values(by=['a','c'], ascending=False) # 컬럼 a, c 기준 데이터 내림차순 정렬
#. 패턴 or 문자열 검사 (.in, .isin) *
# in 연산자 : 특정 패턴을 포함하는 문자열 검사 (벡터연산 불가)
- emp['ENAME'].map(lambda x : 'A' in x) # 'A'를 포함하는 이름 검색
# isin 메서드 : 특정 문자(열)과 정확히 일치하는 문자(열) 검사 (벡터연산 가능)
- emp['ENAME'].isin(['SMITH']) # 'SMITH'라는 이름 검색
#. 패턴 or 문자열 치환 (.replace)
# 패턴 치환 (NA치환 불가, 벡터연산 불가, Series 적용)
- s1 = Series(['1,100','2,200','3,300','4,400'])
s1.map(lambda x : x.replace(',',''))
# 문자열 치환 (NA치환 가능, 벡터연산 가능, 패턴 치환 불가능, DataFrame 적용)
- s2 = Series(['1,00','8,50','0--','0--'])
s2.replace('0--',np.nan)
#. 벡터화된 문자열 메서드 (.str..)
# 벡터화 문자열 추출
- df1['col1'].str[:2]
# 기타 메서드
- df1['col1'].str.split('@').str.get(0) # n번째 요소 반환
- df1['col1'].str.replace(',','')
#. NA 제거 및 치환 (.isnull, .fillna)
# NA 검사
- df1.isnull()
- s1[s1.isnull()] = value # 특정 컬럼의 NA이를 특정 value로 치환
# NA 제거
- df1.dropna() # NA 포함 행 삭제
- df1.dropna(how='all') # 행 전체가 NA인 행만 삭제
- df1.dropna(thresh = n) # NA가 아닌 값이 n개인 행만 출력
# NA 치환
- df1.fillna(value) # 모든 NA를 특정 value로 치환
- df1.fillna({'a':'A', 'b':'B', 'c':'C'}) # 컬럼별 상이한 치환
- df1.fillna(method = 'ffill') # 이전 행 데이터로 치환
- df1.fillna(method = 'bfill') # 이후 행 데이터로 치환
#. 중복 확인 및 제거 (.duplicated, .drop_duplicates)
# 중복 여부 확인
- df1.duplicated()
- df1.duplicated(['col1'])
- df1.duplicated(['col1'], keep='last') # 마지막으로 발견된 중복값 반환
# 중복 데이터 색인
- df1[df1.duplicated()]
# 중복 제거 후 출력
- df1.drop_duplicates()
- df1.drop_duplicates(['col1','col2'], keep='first)
#. 계층화(.stack, .unstack)
df2
# unstack() : 인덱스를 컬럼화 (level=-1, fill_value=None)
- df2.unstack() # 하위 인덱스 컬럼화
- df2.unstack(level=0) # 상위 인덱스 컬럼화
# stack() : 컬럼을 인덱스화 (level=-1, dropna=True)
- df2.stack() # 하위 컬럼 인덱스화
- df2.stack(level=0) # 상위 컬럼 인덱스화
#. 행 or 열 삭제 (.drop) *
# 행 삭제
- df.drop('r1') # 'axis=0' 이 default
- df.drop(['r1','r2'])
# 열 삭제
- df.drop('c1', axis=1) # 'axis=1' 로 column 삭제
- df.drop(['c1','c2'], axis=1)
#. 축(axis) 결합 (pd.concat) *
# 행(row) 결합
- pd.concat([df1, df2])
- pd.concat([df1, df2], join='inner')
# 열(column) 결합
- pd.concat([df1, df3], axis=1)
#. 함수 적용(매핑) (.apply, .map, .applymap) *
# map 함수 : 원소별 적용 (1차원 list, Series)
- list(map(func, l1)) # list
- list(map(func, df['c1'])) # DataFrame의 열(Series)
# map 메서드 : 원소별 적용 (1차원 Series)
- df['c1'].map(func) # DataFrame의 열(Series)
# apply : 그룹 적용 (DataFrame의 행/열별)
- df.apply(sum, 1) # 서로 다른 열별 합
- df.apply(np.mean, 0) # 서로 다른 행별 평균
# applymap : 원소별 적용 (2차원 DataFrame)
- df.applymap(func)
#. 데이터 병합 (.merge, .join) *
# Key값이 같을 때
- pd.merge(df1, df2, on='key')
- pd.merge(df1, df2, on=['key1', 'key2'])
# Key값이 다를 때
- pd.merge(df1, df2, left_on='l_key', right_on='r_key')
# index를 사용할 때
- pd.merge(df1, df2, left_on='l_key', right_index=True)
# join 방식 지정
- pd.merge(df1, df2, on='key', how='outer') # inner, outer, left, right
# indexd의 병합 (.join)
- df1.join(df2, how='outer')
= pd.merge(df1, df2, left_index=True, right_index=True, how='outer')
# 참고) 인덱스 초기화
- df1.reset_index()
#. 범주형 데이터 그룹핑 (.cut)
# pd.cout(data, 구간, right, labels)
- pd.cut(emp['SAL'],[0,1000,2000,10000], right=False, labels=['C','B','A'])
#. 그룹 연산 (.groupby) *
# 연산대상컬럼.groupby(그룹대상컬럼).연산메서드
- sub['승차'].groupby(sub['노선번호']).mean()
= sub.groupby(['노선번호']).mean()['승차']
- sub.groupby(['노선번호','시간']).mean()
- data1.groupby(level=0).sum() # level 지정 가능
# 여러 함수 적용 (.agg)
- sub.iloc[:,[0,2,3]].groupby('노선번호').agg(['sum','mean'])
# 지정 그룹별로 분류
- ar1 = np.where(sub.columns <= 4, 'one', 'two') # 지정 그룹으로 분류
sub.groupby(ar1, axis=1).sum()
# 그룹별 데이터 수 확인
- sub.groupby(sub['노선번호'])['승차'].count()
- sub.groupby(sub['노선번호'])['승차'].size()
* Duplicated level name: " ", assigned to level 1, is already used for level 0 오류 발생 원인,
groupby 키가 원본에 포함 시, 키 값이 중복되면 키 충돌로 에러 발생 => group_keys=False 옵션으로 해결
#. 시계열 데이터 가공 (.strftime, .strptime, .parse, .to_datetime) *
# 날짜 -> 문자열 포맷 변경 .strftime
- now = datetime.now()
- now.strftime('%Y-%m-%d')
- now.strftime('%A)
# 문자열 -> 날짜 파싱 .strptime, parser.parse, .to_datetime(벡터연산 가능)
- day = '2019-02-20'
- datetime.strptime(day, '%Y-%m-%d')
- datetime.strptime(day, '%Y-%m-%d').month
- datetime.strptime(day, '%Y-%m-%d').day
- from dateutil.parser import parse
- parse(day)
- parse(day, dayfirst=False)
- s1 = (['2019-02-19','2019-02-20','2019-02-21'])
- pd.to_datetime(s1)
- pd.to_datetime(s1, format='%Y-%m-%d')
'Python' 카테고리의 다른 글
[Python] Crawling Useful features (엑셀 읽기, 진행률 표시, Selenium) (0) | 2021.08.15 |
---|---|
Wikipedia Data collection & analysis (Wikipedia 국/영문 데이터 수집/분석) (0) | 2021.08.09 |
[NLP] 딥 러닝을 이용한 자연어 처리 입문(Text preprocessing) (0) | 2021.07.17 |
[Python NLP] OpenNMT-py (translate) (0) | 2021.07.05 |
[Python venv] Install Python & Building venv (0) | 2021.07.04 |