다시 이음

pandas trick 및 데이터 다듬기 본문

AI 일별 공부 정리

pandas trick 및 데이터 다듬기

Taeho(Damon) 2021. 7. 12. 19:28

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':[100200], 'col two':[300400]}) 

pd.DataFrame(np.random.rand(48)) 4행, 8열 랜덤 생성 

pd.DataFrame(np.random.rand(48), 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) # 복사