주제
Python 및 Pandas 활용
1. 데이터프레임 파악
2. 시리즈(Series)
3. 다양한 탐색 방법
4. 다양한 조회, 저장, 삭제 방법
5. 피봇 테이블
6. 얕은 복사 vs. 깊은 복사
7. 마크다운
데이터프레임 파악하기
- Google Colab을 통한 실습
- 우선 데이터 파일을 업로드 후 필요한 모듈 임포트
import pandas as pd
import numpy as np # 수학 모듈
import matplotlib.pyplot as plt # 시각화 모듈
import seaborn as sns #시각화 모듈
- 엑셀 파일을 읽어와 데이터프레임 만들기
- read_함수는 여러가지가 존재, html, json 파일 등도 읽을 수 있음
- 데이터 프레임이란 시리즈가 n개 이상 이루어진 데이터
- 수정이 가능 (특정 한 줄만 수정 등)
- 조건에 따라 특정 데이터만 조회할 때 시리즈를 사용함
# read_excel : 엑셀 파일 읽기
# read_csv : csv 파일 읽기
df = pd.read_excel('./slamdunk_player_stats.xlsx')
- 데이터프레임 확인시에는 그냥 변수명을 호출하면 된다
- 데이터프레임 구성 확인
# 전체 데이터프레임 조회
df
# df의 컬럼, 열의 수, non-null 여부, 데이터타입 확인
df.info()
# 처음 5줄 확인
df.head()
# 마지막 5줄 확인
df.tail()
# 처음 3줄 확인
df.head(3)
# 마지막 3줄 확인
df.tail(3)
- Row(행) 데이터 조회
# series로 인덱스 레이블 선택하기
df.loc[1]
# dataframe으로 인덱스 선택하기
df.loc[[1]]
# 여러 행 조회
df.loc[[3, 6, 9]]
# 범위로 조회하기
df.loc[3:7, '이름':'체중']
# 슬라이싱 기법으로 조회
df.loc[3:8:2]
# 슬라이싱 기법2
df.loc[:, ['이름','포지션','소속','리바운드']]
# index location으로 조회하고 싶다면 iloc - 컬럼명을 하나하나 쓰지 않아도 됨
df.iloc[3:7, :5]
시리즈(Series)
- 시리즈는 1차원 데이터이다. 데이터 프레임은 2차원
- 시리즈는 칼럼 수가 1개, 데이터 프레임은 1개 이상
- 데이터프레임은 조회 시 표로 표시, 시리즈는 그렇지 않음
- 시리즈의 예시
df.loc[1]

- 데이터 프레임의 예시
df.loc[[1]]

※ 기술 통계 - describe()
- 데이터프레임의 전반적인 통계를 알 수 있는 함수.
- count, mean, min, max 등을 표시함
- 포함되지 않은 컬럼이 있을 시 파라미터로 include='all' 을 추가

다양한 탐색 방법
1. 문자 탐색 - str
- .str은 문자열로 탐색하겠다는 뜻
- .contains('문자') - '문자'가 담긴 데이터를 모두 반환 (시리즈일 때는 True로 반환됨)
df[df['이름'].str.contains("정")]

2. 특정 위치 인덱스 탐색
- 성이 '정'인 경우
# 이름 컬럼중 0번 인덱스가 정인 선수의 데이터프레임 생성
df[df['이름'].str[0] == '정']
# 다른 str 함수 : str.lower() str.upper() str.startwith() str.endwith()
# 검색한 것을 기준으로 특정 열만 확인
df.loc[df['이름'].str[0] == '정', ['이름','포지션', '신장', '체중']]

3. 수치 탐색
- for문을 사용하지 않고도 각 값에 수치 탐색이 가능함
# 신장이 180 이상인 선수의 시리즈
df['신장'] > 180
# 신장이 180 이상인 선수의 데이터프레임
df[df['신장'] > 180]
4. 데이터프레임 산술연산
- 별도의 데이터프레임을 생성하여 산술연산을 하면 저장이 가능
- 아니라면 컬럼에 산술연산을 한 데이터를 새로 저장
# 시리즈에만 반영
df['신장'] + 100
# 원본 변경
df['신장'] = df['신장'] + 100
# 권장되는 방법 : 별도의 데이터 프레임 생성
df_center = df[df['포지션'] == '센터']
df_power = df[['이름', '신장', '체중', '패스']]
- 연산 후 새로운 데이터프레임 생성 - apply()
- lambda를 이용하여 연산 진행
# df_power 신장을 늘린 시리즈 만들기
df_power['신장'].apply(lambda x : x + 100)
# 기존 테이블에서 신장 늘린 시리즈를 교체하기
df_power['new_신장'] = df_power['신장'].apply(lambda x : x + 100)
df_power.head()

다양한 조회, 저장, 삭제 방법
1. 열 삭제 - del
- 열을 삭제할 때 사용, 하지만 메모리 주소와 내용 모두 삭제되는 강력한 함수. 사용 주의
# 패스평가 열을 삭제
del df_power_new['패스평가']
2. 행 삭제 - drop([index])
- sql의 drop과 비슷함
- 비파괴적(원본에 영향을 주지 않음)이기 때문에 파괴적으로 사용하려면 inplace=True를 지정해주면 된다.
- inplace는 말그대로 그 자리를 새로운 값으로 대체한다는 뜻
# .drop()으로 삭제 -> 비파괴적인 처리
df_power_new.drop(0).head()
# 비파괴적인 처리기 때문에 1. 저장이 필요
df_power_new = df_power_new.drop(5)
df_power_new.head()
# 파괴적인 처리를 위한 2. inplace=True, 파괴적인 처리를 하는 함수들은 결과를 보여주지 않음
df_power_new.drop(2, inplace=True)
df_power_new
3. 열 이름 변경 - rename(columns={'기존' : '변경'}, inplace=True/False)
# 비파괴적인 처리 - 원본은 바뀌지 않는다
df_power_new.rename(columns = {'신장' : '키', '체중' : '몸무게'})
df_power_new.head()
# 파괴적인 처리를 위해 inplace=True
df_power_new.rename(columns = {'신장' : '키', '체중' : '몸무게'}, inplace=True)
df_power_new.head()

4. 정렬 - sort_values(), sort_index()
# 값 정렬 + 비파괴적 처리
df_power_new.sort_values(by='키')
# 값 정렬 + 파괴적 처리
df_power_new.sort_values(by='키', inplace=True)
# 값 정렬(내림차순) + 파괴적 처리
df_power_new.sort_values(by='키', inplace=True, ascending=False)
# index 정렬 + 파괴적 처리
df_power_new.sort_index(inplace=True)
피봇 테이블
- 피봇 테이블 생성 - pivot_table(데이터프레임, index, values, aggfunc)
- aggfunc : 집계함수
- aggfunc=np.mean, aggfunc=sum, aggfunc='sum' 모두 가능
pivot_df = pd.pivot_table(df, index='신장', values=['3점슛', '골밑슛'], aggfunc='mean')
pivot_df.round(2)

얕은 복사(Shallow copy) vs. 깊은 복사(Deep copy)
- 얕은 복사는 변경이 일어나면 원본도 변경됨
- 이유 : 얕은 복사는 데이터를 그대로 복사해서 새로운 데이터를 만드는게 아니라 메모리 주소만 공유하기 때문
# 얕은 복사
pivot_df_shallow = pivot_df
del pivot_df_shallow['골밑슛']
pivot_df_shallow.head()
pivot_df


- 깊은 복사는 동일한 모습의 별개의 데이터를 따로 생성하기 때문에 원본에는 영향을 주지 않음
# 깊은 복사
pivot_df_copy = pivot_df.copy()
del pivot_df_copy['3점슛']
pivot_df_copy.head()
pivot_df.head()


마크다운
- 노트북에서 마크다운을 사용하려면 우선 코드 셀이 아닌 텍스트 셀을 선택
- # 한개는 대제목
- ## 두개는 중제목
- - 불릿 포인트
- ```python ``` 코드 표현
- 이외에도 많은 것들이 존재

느낀점
일주일의 방학이 끝나고 이제 파이썬 판다스 강의가 시작됐다. 아직까지는 기초적인 부분이라 원래 알고 있는 것들이 많아서 따라가기 어렵지 않았다. 마크다운은 처음인데 잘 사용하면 깃허브 리드미 작성때도 유용할 것 같다.
'Data Science > TIL (Today I Learned)' 카테고리의 다른 글
| 프로그래머스 데이터분석 데브코스 1기 - 28일차 (0) | 2024.01.03 |
|---|---|
| 프로그래머스 데이터분석 데브코스 1기 - 27일차 (1) | 2024.01.02 |
| 프로그래머스 데이터분석 데브코스 1기 - 25일차 (0) | 2023.12.22 |
| 프로그래머스 데이터분석 데브코스 1기 - 24일차 (1) | 2023.12.21 |
| 프로그래머스 데이터분석 데브코스 1기 - 23일차 (1) | 2023.12.20 |