KT 에이블스쿨
* 수업일자 : 2025.03.28 (금)
데이터프레임
- 데이터 분석에서 가장 중요한 데이터 구조
- RDBMS의 테이블 또는 엑셀 시트와 같은 형태
import pandas as pd
데이터프레임 만들기
- 리스트, 딕셔너리, csv파일로부터 데이터프레임을 만들 수 있다.
- 인덱스와 열 이름을 별도로 지정해서 만들 수도 있다. index=, columns=
아래는 csv 파일을 읽어와 데이터프레임을 생성하고, 다양하게 탐색해보는 연습을 해보았다.
사용한 데이터셋은 내가 가장 즐겨하는 게임인 '원신'의 캐릭터 리스트이다.
5.2버전까지 출시된 캐릭터의 기초 정보를 담고 있으며
해당 데이터셋을 선택한 이유는 음... 해보고 싶어서라고 할 수 있겠다.
그리고 게임에 대한 이해를 갖추고 있으니 컬럼 의미 파악이나 EDA를 빠르게 수행할 수 있을 것 같았다.
데이터프레임 연습
0. 데이터셋 정보
> 원신 캐릭터 기본 정보
- 총 91명의 캐릭터 (5.6버전인 지금은 총 100명)
- 5.2버전까지 출시된 캐릭터 정보를 포함하고 있음.
[컬럼 의미]
컬럼명 | 컬럼 의미 | 부연 설명 |
Name | 캐릭터명 | |
Element | 원소 타입 | 총 7개의 원소 Pyro : 불 Geo : 바위 Dendro : 풀 Cryo : 얼음 Electro : 번개 Anemo : 바람 Hydro : 물 |
Weapon | 무기 타입 | 총 5가지의 무기 Swords : 한손검 Claymores : 양손검 Polearms : 장병기 Catalysts : 법구 Bows : 활 |
Region | 소속 지역 | 총 7개 지역 Mondstadt : 몬드 Liyue : 리월 Inazuma : 이나즈마 Sumeru : 수메르 Fontaine : 폰타인 Natlan : 나타 Snezhnaya : 스네즈나야 * 주인공인 여행자, 콜라보 캐릭터인 에일로이는 소속지역이 없으므로 None임. |
Model Type | 체형 모델링 타입 | Short : 아동형 Medium : 청소년형 Tall : 장신형 |
Release Date | 출시일 | 월/일/연도 |
Version | 출시 버전 | 1.0 ~ 5.2 |
HP | 기초 HP | 90레벨 기준 기초 HP/공격력/방어력 |
ATK | 기초 공격력 | |
DEF | 기초 방어력 | |
Ascension Stat | 돌파 스탯 | 캐릭터들은 20, 40, 50, 60, 70, 80레벨을 달성하면 돌파를 통해 레벨을 올릴 수 있는데, 캐릭터마다 각기 다른 돌파 스탯이 증가한다. (ex: 공격력, 치유보너스, 원소 피해 보너스 등) |
Ascension Stat Value | ? | 이건 아직 모르겠다.. |
1. csv 읽어오기
- read_csv()함수 주요 옵션
sep : 구분자 지정(기본값=콤마)
header : 헤더가 될 행 번호 지정(기본값=0)
index_col : 인덱스 열 지정(기본값=False)
names : 열 이름으로 사용할 문자열 리스트
skiprows : 처음 몇 줄을 무시할 것인지 지정
- 인덱스 열 지정
'Name'을 인덱스로 지정
- 인덱스 초기화
다시 원래대로 돌아왔다.
2. 데이터프레임 탐색
데이터 탐색에 필요한 유용한 메서드 및 속성 정리
메서드 | |
head() | 앞쪽 행 데이터 확인(디폴트 5) |
tail() | 뒤쪽 행 데이터 확인(디폴트 5) |
info() | 인덱스, 열, 값 개수, 데이터 형식 정보 등 확인 |
describe() | 기술 통계 정보 확인 |
sort_index() | 인덱스 기준 정렬 * ascending=True, 오름차순(디폴트) ascending=False, 내림차순 |
sort_values() | 특정 열을 기준으로 정렬 |
unique() | 고유값 확인 |
value_counts() | 고유값과 그 개수 확인 * dropna=True를 지정하거나 생략하면 NaN 값 제외 |
mode() | 고유값 중 최빈값 확인 |
속성 | |
shape | 데이터프레임 모양 확인 : 행 수*열 수 |
index | 인덱스 정보 확인 |
values | 값 확인 |
columns | 열 이름 확인 |
dtypes | 각 열의 데이터 타입 확인 |
- 기본 집계 메서드
대상 열이나 행을 지정하지 않으면, 전체 집계를 수행
axis=0 : 모든 행 집계 (디폴트)
axis=1 : 모든 열 집계
sum() | 합 |
mean() | 평균 |
max() | 최댓값 |
min() | 최솟값 |
count() | 개수 |
- 특정 열 조회
df.loc[ : , [열 이름1, 열 이름2, ...]] 형태로 조회
- df[[열 이름1, 열 이름2, ...]] 형태로 사용하는 것이 일반적
- 조회할 열이 하나라면 리스트 형태가 아니어도 됨. (결과는 시리즈)
** 시리즈 : Pandas가 제공하는 자료구조 중 하나로, 열이 하나로 구성된 자료형임.
시리즈 + 시리즈 = 데이터프레임
- 범위 조회
범위의 마지막 열도 조회 대상에 포함됨.
- 조건으로 조회
df.loc[조건]
and -> &
or -> |
여러 조건 조회 시 각 조건은 소괄호로 묶어야 함.
isin([값1, 값2, 값3, ...]) : 값1, 값2, 값3... 의 값인 데이터만 조회
bwtween(값1, 값2) : 값1 ~ 값2까지 범위 안의 데이터만 조회
3. 데이터프레임 변경
- 열 이름 변경 : rename()
- 열 추가
맨 뒤 열로 추가 됨. 지정한 위치에 열을 추가하려면
insert(위치, 추가할 열)
참고. str(), astype(str)은 모두 문자열로 변환하는 데 사용하지만, 사용목적과 결과물이 다르다.
처음에 str(genshin['release_date']).... 로 했다가 release_date와 version의 모든 컬럼값이 release에 입력되었다.
GPT에게 차이를 물어보니 이럴 때는 astype(str)를 사용하는 것이 적절하다고.
시리즈의 각 요소(원소)를 변환하고 싶을 때는 str()이 아닌 astype을 사용해야 한다.
- 열 삭제
axis=0 : 행 삭제(디폴트)
axis=1 : 열 삭제
- 결측치 확인
isnull(), isna() | 결측치=True, 유효한 값=False |
notnull(), notna() | 결측치=False, 유효한 값=True |
참고. 결측치의 원인은 다음과 같다.
[ element ]
- travler(여행자) : 게임 설정 상 여행자는 여러 원소를 사용할 수 있기 때문에, 특정 원소를 입력하지 않고 None으로 기재한 것으로 보인다.
[ region ]
- travler(여행자) : '여행자'라는 이름에 맞게 특정 지역에 소속되지 않고 여러 나라를 여행한다.
- aloy(에일로이) : 액션 RPG게임 '호라이즌 제로 던'과 콜라보 한 캐릭터로, 원신 세계관 내 캐릭터가 아니다.
- 결측치 제거
dropna() : 결측치가 있는 열이나 행 제거
genshin.dropna(axis=0, inplace=True) -> 결측치가 하나라도 있는 행 제거 (열 상관없이)
genshin.dropna(subset=['region'], axis=0, inplace=True) -> 특정 열에 결측치가 있는 행 제
- 결측치 채우기
fillna() : 결측치를 다른 값으로 채우기
평균값, 특정 값 등등 ... 어떻게 채울 것인지는 데이터셋의 상황에 따라 다르게 결정
ffill() : 바로 앞의 값으로 변경 (forward)
bill() : 바로 다음 값으로 변경 (backward)
- 데이터프레임 합치기 : concat()
인덱스 값 기준 합치기
- 데이터프레임 조인 : merge()
지정한 키 값을 기준 병합
'KT aivleschool' 카테고리의 다른 글
[1주차] 파이썬 기초 (1) | 2025.05.09 |
---|---|
[1주차] Git (0) | 2025.05.06 |
KT에이블스쿨 7기 AI트랙 합격 후기 | 지원부터 합격까지 (0) | 2025.04.29 |