티스토리 뷰

Python

[Python 정리] 데이터 가공

Aaron 2019. 2. 20. 16:19
반응형

 


#. 색인 (.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')




반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday