학습 주제
- Level 0에서 Pandas 따라하기
주요 학습 내용
- jupyter note북에 더 자세히 정리했습니다.
- DataFrame
- df
- 타입확인
- type(df) - 데이터프레임 구성 확인
- df.info() - 앞쪽 뒤쪽 데이터 확인하기
- 앞쪽 : df.head(개수)
- 뒤쪽 : df.tail(개수)
- Row(행) 데이터를 선택(조회)하기 - index, slice, loc, iloc
- series로 인덱스 레이블 선택(조회)하기
- df.loc[[1]] - 여러 행 조회하기
- df.loc[[3, 6, 9] , ["이름", "체중"] ] - 범위로 조회하기
- df.loc[3:7, "이름" : "체중"] - 슬라이싱 기법으로 조회하기
- df.loc[3:8:2]
- [3부터 8까지 2단계] - 슬라이싱 기법으로 조회하기 2
- df.loc[:, ['이름', '포지션', '소속', '리바운드']
- [모든행 선택, ['이름', '포지션', '소속', '리바운드'] <= 선택하고자 하는 열의 이름들] - index, location으로 조회하고 싶다면 = iloc
- df.iloc[3:7, 0:6]
- series로 인덱스 레이블 선택(조회)하기
- Series가 중요한 이유
- 단일 열 '이름' 조회하기 -> 시리즈 -> 1차원 데이터
- 조건에 따라 특정 데이터만 조회할 때 시리즈를 사용한다.
- 딘일 열 조회
- df['이름'] - 타입확인
- type(df.;loc[1]), type(df['이름']) - 기술 통계
- df.describe() : 간단하게 살펴볼 수 있다.
- df.describe(include= 'all')
- 한글 =>가장 많은것 들중 위에서 부터 먼저 발견된것
- 딘일 열 조회
- 문자 탐색
- str- 문자열 메소드 활용가능
- df['이름'].str - str.contains
- df['이름'].srt.contains('정')
- 정을 포함한 값 T/F로 나온다. - sum
- sum(df['이름'].str.contains('정')) / df['이름'].str.contains('정').sum() - 둘다 가능하다. - 체인형을 지향
- df['이름'].str.contains('정').sum() - T/F로 이루어진 boolean형 시리즈 또는 배열로 True에 해당하는 값들만 조회할 수 있다.
- df[df[ 이름'].str.contains('정').sum() ]
- str- 문자열 메소드 활용가능
- 특정 위치 인덱스만 탐색
- 정씨 인가? T/F로 이루어진 시리즈 생성
- df['이름'].str[0] == '정' - 정씨에 해당하는 데이터프레임 생성
- df[df['이름'].str[0] == '정']] - .str.lower() .str.upper() .str.startwith() .str.endwith() 처럼 문자열 메소드를 활용할 수 있다.
- df[df['이름'].str[0] == '정', ['이름', '포지션', '신장', '체중']] - 검색한 것을 기준으로 특정 열만 확인하려면
- 정씨 인가? T/F로 이루어진 시리즈 생성
- 수치 탐색
- 180보다 큰 사람인 T/F시리즈 만들기
- df['신장'] > 180 - 180보다 큰 사람 DataFrame 만들기
- df[df['신장'] > 180]
- 180보다 큰 사람인 T/F시리즈 만들기
- 데이터프레임 산술연산
- 모든 선수 신장 100 추가하기
- df['신장'] + 100
- 모든 선수 신장 100 추가하기
- 별도의 Dataframe 생성
- 포지션이 센터에 해당되는 사람만 가진 경우
- df['포지션'] == '센터'
- 데이터로 저장하고 싶을 시
: df_center = df[df['포지션'] == '센터'] - 이름, 신장, 체중, 패스만 가진 경우
- df_power = df[['이름', '신장', '체중', '패스']]
- 포지션이 센터에 해당되는 사람만 가진 경우
- 연산 후 새로운 데이터프레임 생성
- df_power 신장을 늘린 시리즈 만들기
- df_power['신장'].apply(lambdas x : x + 100) - 기존 체이블에서 신장 늘린 시리즈를 교체하기
- df_power = df_power['신장'].apply(lambdas x : x + 100) - 패스 능력치 별 평가
- def check_skill_pass(x):
if x >= 90:
return : '우수'
elif x >= 70 :
return : '보통'
return ' 미흡; - 함수 적용하여 새로운 열 추가하기
- df_power['패스평가'] = df_power['패스'].apply(check_skill_pass) - 파이썬에서 for과 원본데이터를 조작할 때 의도치 않은 상황
- numbers = [0, 1, 2, 3, 4, 5]
for n in numbers:
print(n)
numbers.remove(n) - 파이썬에서 for을 이용한 유사한 상황 - .copy()나 [:]로 해결
- numbers = [0, 1, 2, 3, 4, 5]
for n in numbers.copy()
print(n)
numbers.remove(n)
- df_power 신장을 늘린 시리즈 만들기
- 열(col) 삭제
- del df['열이름'] -> Series
- 행(Row)삭제
- drop()으로 삭제 -> 비파괴적인 처리
- df_power_new.drop(0).head() - 비파괴적인 처리기 때문에 1. 저장이 필요
- df_power_new.drop = df_power_new.drop(0).head() - 파괴적인 처리를 위한 2. inplace=True
- df_power_new.drop(0, inplace = True)
- drop()으로 삭제 -> 비파괴적인 처리
- 열 이름 변경
- 비파괴적인 처리 - 원본은 바뀌지 않는다
- 파괴적인 처리를 위해 inplace=True
- 정렬
- 값 정렬 + 비파괴적 처리
- 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_values(inplace = True)
- 값 정렬 + 비파괴적 처리
- 얕은 복사 (Shallow Copy) vs 깊은 복사(Deep Copy)
- 피봇으로 만든 데이터프레임 조회
- pivot_df_shallow = pivot_df - 1. 얕은 복사 2. 깊은 복사
- 1. pivot_df_shallw = picot_df
- 2. pivot_df_copy = pivot_df.copy() - 얕은 복사는 변경이 일어나면 원본도 변경됨
- 얕은 복사는 변경이 일어나면 원본도 변경됨 - 메모리 주소 공유, 사실상 변수명만 다른 것
- 깊은 복사는 별개의 df기에 원본에 영향을 주지 않음
- deep copy의 변경을 시켜보면 pivot_df_copy는 변했지만
- pivot_df는 변하지 않는다.
- 피봇으로 만든 데이터프레임 조회
학습하면서 어려웠던 내용
- 주피터 노트북은 처음써보는데 파이썬과 비슷한 것 같아 다행이면서도 쓰는 양식이라등 새로 익힐 것이 많다
반응형
'데이터분석' 카테고리의 다른 글
28. Jupyter- DataFrame (0) | 2024.01.08 |
---|---|
27. Jupyter 사용 (1) | 2024.01.08 |
25. 트랜잭션 및 SQL 고급 문법 (0) | 2023.12.30 |
24. JOIN (1) | 2023.12.29 |
23. GROUP BY & AGGREGATE (0) | 2023.12.29 |