Search
🔺

6. 파이썬 라이브러리 Pandas

CHAPTER 4. Pandas

1. Pandas란?

Pandas : python data anaylsis
Pandas 라이브러리에서 기본적으로 데이터를 다루는 단위는 DataFrame
(Spreadsheet 형태)
이러한 형태의 데이터는 Structured Data 또는 Panel Data 또는 Tabular Data라고 부름

2. Pandas의 기본 자료구조(Series, DataFrame)

DataFrame은 2차원 테이블이고, 테이블의 한 줄(행/열)을 Series라고 함
→ Series의 모임이 곧, DataFrame
Series 기본 모양
DataFrame의 기본 모양
pd.date_range(’20210101’, periods = 6) 날짜 범위 생성
pd.DataFrame(values, index, columns)
index : 왼쪽
columns: 위

3. DataFrame Method

df2.head()맨 위 다섯줄을 보여줌, df2(head)(3) → 맨 위 세줄
df2.tail()은 밑에서부터
df.index → 인덱스를 확인
df.columns → 컬럼을 확인
df.values → 값 확인
df.info()→ 대략적인 정보 확인
df.describe() → 전체적인 통계정보
df2.sort_values(by = 'B', ascending = False) → B 컬럼을 기준으로 정렬(내림차순)
df2.sort_values(by = 'B', ascending = False).head(3) → B기준 제일 큰 값 세개
데이터 불러오기 read_csv()
→ 현재까지의 경로를 ./로 축약
데이터 저장하기
o_csv()
to_excel()

4. DataFrame Indexing

컬럼 기준딕셔너리
df[’A’] 인덱싱
df[[’loan,amnt’, ‘grade]] 여러 컬럼
로우 기준 시리즈
인덱싱
문자로 가져오기 df.loc[’2021-01-01’]
인덱스 위치로 가져오기 df.iloc[2]
슬라이싱
위치 기준으로 df[:3]
문자 기준으로 df[’2021-01-02’ : ‘2021-01-04’]
df.iloc[:10:2, 2:3] → 처음부터 10번째까지, 둘 간격으로, 컬럼은 2:3
로우, 컬럼 함께
df.loc[:, [’A’, ‘B’]]
df.loc[’2021-01-03’:’2021-01-05’, [’A’,’B’]]
→ 물론 df.loc[’2021-01-02’, [’A’]] 인덱싱도 가능
df.iloc[[1,2,4], [3,4]]

5. DataFrame 기타

DataFrame 복사
df3 = df.copy()
새로운 컬럼 추가하기
df2[’E’] = [’one, ‘one....]
인덱스 수랑 동일하게
딕셔너리랑 유사
key값을 따로 안쓰면 순서대로 들어감
해당 항목이 있는지 확인
df2[’E’].isin([’two’, ‘four’])
two와 four이 있느냐
unique() 컬럼단위로 접근하고 각 컬럼의 고유값 출력(중복되지 않는 모든값)
nunique() 고유값 개수
데이터 프레임의 구조
딕셔너리 → 내부는 array로 묶여져 있음
df[df['grade'] == 'A']['emp_title'] 신용등급이 A인 샘플의 emp_title 확인
df[df['grade'] == 'A']['emp_title'].unique() → 이 경우 고유 값이 어레이 형태로 나옴
df[’loan_amnt’].mean() 평균값
df[(df['grade'] == 'A') | (df['grade'] == 'B')] 그레이드가 A면서 B인 값
idmax
argmax는 샘플링 전 전체 데이터 인덱스를 빼오기 때문에
조건식으로 데이터를 선별 한 이후에는 idxmax, idxmin 함수를 사용
# df grade C 와 D 인 채권샘플 annual_inc 최대값인 인덱스 빼오기 (idxmax) df[(df['grade'] == 'C')| (df['grade'] == 'D')]['annual_inc'].idxmax() # 최대값 인덱스 빼와서 샘플까지 출력 df.take([df[(df['grade'] == 'C')| (df['grade'] == 'D')]['annual_inc'].idxmax()])
Python
복사
df[df['purpose'].str.contains('card')] 문자가 있는지 확인
Cannot mask with non-boolean array containing NA / NaN values’ 라는 오류가 발생하는 경우는 NAN값이 포함되어 있어서임 이럴때는 아래처럼 설정
df[df['emp_title'].str.contains('mechanic',na=False)]

6. 데이터프레임 병합

실제 분석업무를 진행하다보면 데이터가 여기저기 분산되어 있을 경우가 더 음
조각난 데이터를 분석에 필요한 데이터셋으로 만들기 위해 데이터프레임 병합을 사용.

6-1. 데이터 병합에 사용가능한 key(병합할 기준이 되는 행 or 열)값이 있는 경우

pd.merge(베이스데이터프레임, 병합할데이터프레임) → 조건을 주고 이어붙이는 것
키 값이 같은 경우
pd.merge(merge_df1, merge_df2, how = 'outer')
how : 'left', 'right', 'inner', 'outer'
left: 왼쪽 데이터프레임 기준으로
right: 오른쪽 데이터프레임 기준으로
inner: 양쪽 데이터 프레임에 데이터가 모두 있는 경우만
outer: 한쪽에만 있어도 데이터를 합침
키 값이 다른 경우
left_on : key값이 다를 경우 베이스데이터프레임의 key 설정/ right_on : key값이 다를 경우 병합데이터프레임의 key 설정
pd.merge(merge_df1, merge_df2, how = 'outer', left_on = '이름', right_on = 'name')

6-2. 단순 데이터 연결

pd.concat([베이스데이터프레임, 병합할데이터프레임], axis=0 or 1) → 그대로 이어붙이는 것
axis : 축 방향 설정
1.
이어붙일 데이터 두개의 컬럼 등이 같은지 검증하기
df.shape, df1.shape
df.columns = df1.columns
2.
이어붙이기 pd.concat([df, df1])
pd.concat([df, df1], axis = 0) 아래로 이어붙이는것
shape → 100000, 146
df3 = pd.concat([df, df1], axis = 1) 옆으로 이어붙이는 것
shape → 5000, 292

7. 인덱스 편집

concat_df.reset_index() 인덱스를 다시 리셋(기존 인덱스도 존재)
reset_index(drop = True) 기존인덱스를 버림
reset_index(drop = True, inplace = True) 원본값은 버리고 저장하는 것
concat_df.set_index('loan_amnt') 인덱스를 다른걸로 다시 설정

8. 컬럼선택, 편집, 삭제

컬럼선택
df.columns
컬럼안에서 선택은 df.columns[0]
컬럼삭제
1.
df.info()로 null 값이 있는지 확인
2.
person_df['id'].isna().all()로 null 값이 있는지 확인. 전체가 null 이면 ‘True’가 나옴
3.
del person_df[’member_id’]
또는 person.df.drop(’member_id’, axis = 1)
또는 person_df.pop(’member_id’)
컬럼명 변경
person_df.rename(columns = {'home_ownership':'home'})

9. 데이터 샘플링 분석

1.
데이터 값 확인
값을 카운트 하기 df['emp_title'].value_counts()
슬라이싱도 가능 df['emp_title'].value_counts()[:20]
근데 문제가 있음! → Manager와 manager 소문자 대문자로 구분되어있는 경우가 있음
2.
astype(str) 소문자 변환 전 혹시모를 int, float 데이터가 있을지 모를 상황에 대비해서 모두 문자열로 변경
3.
모든걸 다 소문자로 바꾸기 전에 index 넘버를 다 삽입해주는 작업
d.
다 소문자로 바꾸기 권장하지 않음 너무 오래걸림!
for index, item in enumerate(df['emp_title']: df.loc[index, 'emp_title'] = item.lower()
Python
복사
5.
다른 방법으로 다 소문자로 바꾸기
numpy를 학습하면서 브로드캐스팅에 관하여 잠깐 언급했었습니다. 그렇다면 그 파워풀하다던 브로드캐스팅은 어떻게 사용해야할까요?
apply 함수로 컬럼에 적용시키는 코드 구조
df['컬럼명'] = df['컬럼명'].apply(lambda x: func(x) if 조건문)
df['컬럼명'] = df['컬럼 kt명'].apply(func_nm)
대문자 만드는 함수
#함수만들기 ------------- def upper_function(x): return x.upper() #컬럼에 적용하기--------- df['emp_title'].apply(upper_function)
Python
복사

10. 데이터 재구조화

groupby 하는 기능, 엑셀의 pivot table과 비슷한 기능
df.groupby(’emp_title’).mean()
emp_title기준으로 데이터를 같은 기준끼리 묶고 그들의 평균을 내
unique값이 나옴(아래의 경우 20912개)
df.pivot_table 엑셀의 피벗테이블과 유사
# pivot_table----------------------- pd.pivot_table(df, #전달할 데이터 프레임 columns = , #기준1 index = , #기준2 values , #정리되는 데이터 aggfunc = #어떤기준으로 정리할꺼냐) # 신용등급과 거주구분에 따른 이자율 평균을 데이터프레임으로 다시 만든 것 pd.pivot_table(df, columns = 'grade', index = 'home', values = 'int_rate', aggfunc = np.mean)
Python
복사

11. 결측치 처리

df[’emp_title’].isnull() null이 몇개 인지 값 확인
데이터 결측치율이 적은 경우 평균으로 대체하는 경우가 많음
df[df['dti'].isnull()].index 결측치가 있는 인덱스 확인
df[’dti’].fillna(df['dti'].mean()) NaN 값을 평균으로 채우기
앞뒤에 있는 데이터로 결측치를 채우는 방법
df['dti'].fillna(method = 'bfill') df['dti'].fillna(method = 'ffill')
df['dti'].fillna(method = 'bfill').fillna(method = 'ffill')
df.dropna() 문자 결측치 제거