본문 바로가기
통계, EDA, 선형대수/Data Process & EDA

n113 Data Manipulation(merge, melt, concat)

by kiimy 2021. 5. 10.
728x90
728x90

*pandas version 확인

*pd.__version__ /// pd.show__version()

 


def coloring_text(val):
  if val > 0:
    color = '#1e3799'
  else:
    color = '#eb2f06'
  return 'color: %s' % color

df[['순이익률']].style.applymap(coloring_text)   

해당 부분 색바꿔줌

*df.applymap(lambda x: x**2) ==> 해당 함수 적용

 

pip install pandas

##pandas version 확인

*pd.__version__ /// pd.show__version() ==> python, pandas, numpy, matplotlib ... 버전확인가능

 

##create DataFrame

*pd.DataFrame({'':['']}

 

##설정할 값이 많을 경우 Numpy as np 씀

-pd.DataFrame(np.random.rand(,), columns='asgsdf' ==> columns index 부분 해당 문자로 변경)

 

##rename columns = 예)공백을 없애는 법/ 

1. df.rename({'col one': 'col_one'})

2. df.columns= ['col_one']

3. df.columns= df.columns.str.replace('', '_')

 

##모든 열 이름에 접두사 or 접미사

-df.add_prefix(X_) ==> 열 이름 앞에 X_ 붙음

-df.add_suffix('_Y') ==> 얄 이름 뒤에 _Y붙음

 

##reverse row order/ column

- df.loc[::-1] row 행 거꾸로

- df.loc[:, ::-1] row 모든 행과 column 거꾸로

but 이렇게 하면 인덱스 번호도 거꾸로 나옴

so, df.loc[::-1].reset_index(drop=True) 해줘야 됨

 

##select_columns

- df에서 int나 float만 가져오고 싶다면 ==> df.select_dtypes(include='number')

or 특정 부분을 제외하고싶다면 exclude='type'

 

##convert strings to numbers

- df.astype({'': 변경할려는 'type'})

- if 해당 값이 없다면? ==> NaN으로 처리해줘야됨

df.to_numberic(df.해당열, errors='coerce') ==> 해당 열의 값에 error가 나면 NaN으로 변경해줌

df.to_numberic(df.해당열, errors='coerce').fillna(0)

 

if 전부 적용을 시킬거라면 to_numberic을 사용하여 apply를 적용시킴

df = df.apply(pd.to_numberic, errors='coerce').fillna(0) ==> 모든 type = float!!!

 

## DataFrame size 줄이기

- 먼저 df.info(memory_usage='deep') 확인 후 / memory_usage==> 데이터 크기

보고싶은 칼럼을 먼저 변수로 두고 cols= ['', '']/////usecols 사용함

파일 불러오기 == > url_csv = pd.read_csv('asdaosdk.csv', usecols=cols)

 

or dtypes = {'해당열':'category'} ==> 카테고리 데이터 유형은 메모리 사용량이 적은경우에만

 

==> url_csv = pd.read_csv('asdaosdk.csv', usecols=cols, dtype=dtypes)

 

##행단위로 여러 파일에서 DataFrame 빌드

- from glob import glob

예를 들어 data/stocks1.csv, data/stocks2.csv, data/stocks3.csv

*stock_files = sorted(glob('data/stocks*.csv')) 내장 정렬을 사용하여 concat 합치는 제너레이션함수

 

*pd.concat((pd.read_csv(file) for in stock_files))

==> index에 중복된 값이 생긴다?? == index가 마구잡이로 나옴

*pd.concat((pd.read_csv(file) for in stock_files), ignore_index=True)

 

## 두개파일의 열이 다르고 열을 나열하고싶다면 ==>  열을 연결해주는거임

*pd.concat((pd.read_csv(file) for in stock_files), axis='columns')

 

##pd.read_clipboard() 사용법 ==> excel 에서 그냥 복사하면됨

 

##DataFrame을 분할==> 왜??  하나는 75프로/ 다른하나는 25프로 분할

movie_1 = movies.sample(frac=0.75, random_state=1234)

movie_2 = movie.drop(movies_1.index)

 

movies_1.index.sort_values()

 

##해당 열이 가지고 있는 특징을 가지고 추출( ㅣ = or, & = and, ~ = not)

ex) df.해당열.unique() == > array 리스트가 나옴

 

Groupby

  1. 주식 종목들의 평균 순이익률은 얼마일까
  2. 단, 순이익률이 -인 종목은 제외하고 계산
  3. 추가로 테마별로 // 칼럼에 있는 unique 고유값

In [30]:

df_subset.groupby('테마').순이익률.mean()

Out[30]:

테마

육계 9.255000                           

주류 3.303333

Name: 순이익률, dtype: float64

*****************isin 중요******

isin

순이익률 처럼 숫자형(numerical) 값을 기준으로 사용하는 것이 아닌,

범주형 (categorical) 데이터를 기준으로 conditioning을 하려는 경우는 어떻게 해야할까요??

 

1. df[(df.해당열 == 'unique값') ㅣ....)]

2. df[df.해당열.isin(['unique값', ....])]

3. df[~df.해당열.isin(['unique값', ....])] ==> 앞에 ~ 가 붙으면 이것을 제외하고 나옴

 

##가장 인기있는 종목을 찾는 방법

먼저 counts = df.해당열.value_counts() ==>  갯수가 가장 많은 것을 찾음

 

counts.nlargest(3) 가장 큰값 3개 추출// 필요한건 index뿐 = counts.nlargest(3).index

**해당열 목록처럼 취급 isin사용

df[df.해당열.isin(counts.nlargest(3).index)]

 

##결측값처리 NaN값의 수 == df.isna().sum() 사용 값을 1로 생각하고 더함

##누락된 값이 있는 열 삭제 df.dropna(axis='columns')

##dropna(tresh=len(df)*0.9, axis='columns')

*tresh

axis=1, thresh=N으로 설정하면 세로 방향(column)에 nan이 있다면 삭제시키되 다만 Nan이

아닌 값의 개수가 N개보다 적을 때 그 열을 삭제한다.

 

## split 사용

이름이 Jane Ann Smith 사이에 공백이 있다

df.[{'first', 'middle' ...}] = df.name.str.split(' ', expend=True)

하면 DataFrame에 first, middle.. 열이 추가되어 해당 이름 Jane / ann / Smith 나옴

 

##melt, pivot_table 자주 쓰임 중요해



## set_index() == drop=True default 값임 // 삭제 안할려면 False라고 써줘여함('인자'

## reset_index() ==

인자가 필요없음 drop= False default // 삭제 할려면 True ==> 기존인덱스 삭제

inplace= False default // 원본데이터에 대체한다면 True

 

pd.set_option('display.float_format', '{:.2f}'.format) // 모든 data 소수점 둘째자리까지

728x90

댓글