일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- AARRR
- AWS builders
- NLP
- 유데미부트캠프
- 임베딩
- 서비스기획부트캠프
- sql정리
- NLU
- 취업부트캠프 5기
- 취업부트캠프
- SLASH22
- 데이터도서
- 그래프
- 사이드프로젝트
- pytorch
- 스타터스
- SQL
- 서비스기획
- MatchSum
- BERT
- 알고리즘
- 특성중요도
- 그로스해킹
- 추천시스템
- 스타터스부트캠프
- 토스
- 유데미큐레이션
- 딥러닝
- 부트캠프후기
- 유데미코리아
- Today
- Total
다시 이음
pandas trick 및 데이터 다듬기 본문
https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb
참고자료
-버전 확인하기
pd.__version__
pd.show_versions()
-데이터프레임 생성
df = pd.DataFrame({'col one':[100, 200], 'col two':[300, 400]})
pd.DataFrame(np.random.rand(4, 8)) 4행, 8열 랜덤 생성
pd.DataFrame(np.random.rand(4, 8), columns=list('abcdefgh')) 4행, 8열에 랜덤 생성, 열이름을 abcdefgh로 생성
-이름 바꾸기
위에 3 개는 같은 결과를 냄.
df = df.rename({'col one':'col_one', 'col two':'col_two'}, axis='columns') - 여려개 한번에 변경
df.columns = ['col_one', 'col_two'] - 한개 변경
df.columns = df.columns.str.replace(' ', '_') 빈공간대신 _를 대체
df.add_prefix('X_') - 이름앞에 추가
df.add_suffix('_Y') - 이름 뒤에 추가
-행 순서 변경
drinks.loc[::-1].head() - 원래 불러오던 값을 역차례로 분류함
drinks.loc[::-1].reset_index(drop=True).head() - 역차례로 불러온 값에 인덱스를 다시 0부터 다시 부여.
-열 순서 변경
drinks.loc[:, ::-1].head() - 뒤에 있던 열이 가장 앞으로 옴
-열의 자료형 선택하기
Drinks.dtypes - 열의 데이터 타입 확인
drinks.select_dtypes(include='number').head() - 숫자를 포함하는 데이터 타입열만 불러옴
drinks.select_dtypes(include='object').head() - 문자를 포함하는 데이터 타입열만 불러옴
drinks.select_dtypes(include=['number', 'object', 'category', 'datetime']).head()
drinks.select_dtypes(exclude='number').head() - 숫자를 제외한 열만 불러옴
-문자열을 숫자열로 변경하기
df.astype({'col_one':'float', 'col_two':'float'}).dtypes - ‘-’와 같은 문자가 포함되어 있지 않으면 변경 가능
pd.to_numeric(df.col_three, errors='coerce') - 한번에 숫자로 변경, 에러는 nan 값으로 변경
pd.to_numeric(df.col_three, errors='coerce').fillna(0) - 한번에 숫자로 변경, nan값을 0으로 채운다.
-데이터 사이즈 줄이기 - 양이 많을 경우 용량 줄이자
drinks.info(memory_usage='deep') - 파일의 정보 보기, 용량, 행,열의 수
cols = ['beer_servings', 'continent']
small_drinks = pd.read_csv('http://bit.ly/drinksbycountry', usecols=cols) small_drinks.info(memory_usage='deep') - cols로 명명한 열만 불러옴,
dtypes = {'continent':'category'}
smaller_drinks = pd.read_csv('http://bit.ly/drinksbycountry', usecols=cols, dtype=dtypes) smaller_drinks.info(memory_usage='deep')
- 성별, 학년등 반복되는 숫자,문자를 가진 경우 카테고리 형 데이터로 변경하여 용량을 줄일 수 있다.
-여러 파일에서 데이터프레임 세우기(행 기준으로 불러오기)
from glob import glob – glob 라이브러리 사용
stock_files = sorted(glob('data/stocks*.csv'))
stock_files - sorted는 입력한 이름에 ‘*’기호를 제외한 값이 동일한 이름을 찾아줌. 1,2,3 같이
pd.concat((pd.read_csv(file) for file in stock_files)) - concat은 해당 파일을 묶어서 한번에 보여줌
pd.concat((pd.read_csv(file) for file in stock_files), ignore_index=True) - 불러온 파일마다 있던 index를 버리고 새로 인덱스를 지정
-여러파일에서 데이터 프레임 세우기 (열 기준으로)
pd.concat((pd.read_csv(file) for file in stock_files), axis=’columns’)
- 몇개의 행에 파일에 있는 열을 모두 합쳐서 보여줌
-데이터프레임 클립보드에서 따오기
df = pd.read_clipboard() - 엑셀에서 복사를 하고 명령어를 넣으면 복사된 표를 보여줌.
-인덱스를 통해서 데이터프레임 나누기
len(movies) - 인덱스 갯수 파악
movies_1 = movies.sample(frac=0.75, random_state=1234) - 75퍼센트의 행의 데이터만 가져와서 무비1으로 만들고 배열은 1234순서대로
movies_2 = movies.drop(movies_1.index) - 무비 파일에서 무비1에 포함된 거 빼고 넣기
len(movies_1) + len(movies_2) - 처음 인덱스 갯수랑 같음
movies_1.index.sort_values() - 인덱스 데이터 정보, 이름, 갯수 말해줌
movies_2.index.sort_values()
-여러 개의 카테고리가 있는 데이터 프레임 필터
movies.genre.unique() - ‘genre’열에 있는 값 보여주기 (알파벳,숫자 순서대로, 중복값 제외)
movies[movies.genre.isin(['Action', 'Drama', 'Western'])].head() - 3개의 카테고리가 포함된 데이터만 불러오기
movies[~movies.genre.isin(['Action', 'Drama', 'Western'])].head() - 3개의 카테고리 제외하고 불러오기
-큰 데이터 필터링
counts = movies.genre.value_counts() - ‘genre’열에 있는 카테고리별 개수 파악
counts.nlargest(3) - counts 데이터중에 가장 큰 데이터 3개 불러오기
counts.nlargest(3).index - 가장 큰 데이터 3개의 인덱스 찾기
movies[movies.genre.isin(counts.nlargest(3).index)].head() - 3개의 데이터만 불러오기
-결측치 처리하기
ufo.isna().sum() - 열 별로 결측 개수 찾기
ufo.isna().mean() - 열 별로 결측률 확인하기
ufo.dropna(axis='columns').head() - 결측치가 포함된 열을 모두 제거하기
ufo.dropna(thresh=len(ufo)*0.9, axis='columns').head() - 결측치가 포함된 열중 결측률이 10%이상이면 제거하기
-문자열 값 나누기
df.name.str.split(' ', expand=True) - name열의 문자열 나누기(공백을 기준으로)
df[['first', 'middle', 'last']] = df.name.str.split(' ', expand=True) - first,middle,last열을 추가해서 그 안에 넣기
df.location.str.split(', ', expand=True) 공백기준으로 나누기
df['city'] = df.location.str.split(', ', expand=True)[0] 나눈 값에 첫번째 값만 city 열생성해서 넣기
-열에 있는 데이터를 뽑아내서 각 열로 만들어주기
df_new = df.col_two.apply(pd.Series) - col_two열에 있던 값 : [10, 40]., 을 새로운 시리즈로 만들어 10, 40 각각 열에 넣어줌
pd.concat([df, df_new], axis='columns') - 뽑아내온 열을 다시 df 에 합침
데이터 manipulation
df = pd.concat(['열이름1 or 데이터프레임 이름1','열이름2',...], axis =0 or 1)
df = df1.merge(df2)
# 파라미터 중 how = right, left, inner 등에 따라 합쳐지는 모양이 달라짐.
concat은 데이터프레임 및 열도 합칠 수 있으며 axis = 0일 시 밑(행)으로 axis = 1일 시 옆(열)으로 합쳐진다.
중요한 것은 두 데이터 간에 index 혹은 column에 동일한 기준이 없으면
axis = 0 일 시 수많은 nan을 동반하고, axis = 1일 시 trace back 나옴.
결국, 공통분모가 없는 데이터를 concat으로 합칠 경우엔 reset_index를 통하여 index를 기본형(1,2,3,4)로 변경하여 합치면 에러를 피할 수 있다.
concat 파라미터 분석
pd.concat(objs, # Series, DataFrame, Panel object axis=0, # 0: 위+아래로 합치기, 1: 왼쪽+오른쪽으로 합치기 join='outer', # 'outer': 합집합(union), 'inner': 교집합(intersection) join_axes=None, ignore_index=False,# axis=1 일 경우 특정 DataFrame의 index를 그대로 이용하려면 true 입력 # False: 기존 index 유지, keys=None, # 계층적 index 사용하려면 keys 튜플 입력 levels=None, names=None, # index의 이름 부여하려면 names 튜플 입력 verify_integrity=False, # True: index 중복 확인 copy=True) # 복사
'AI 일별 공부 정리' 카테고리의 다른 글
데이터 통계 - 4 (베이즈 정리) (0) | 2021.07.20 |
---|---|
데이터 통계 - 3 (신뢰구간 설정과 ANOVA) (0) | 2021.07.19 |
데이터 통계 -2 (추가적 가설 검정) (0) | 2021.07.16 |
데이터 통계 -1 (샘플링과 가설 검정) (0) | 2021.07.15 |
pandas 기초 이해 (0) | 2021.07.10 |