[2024.09.27] 필수 온라인 강의 Part2 파이썬 라이브러리 활용 CH03 데이터 자료 처리 라이브러리(Pandas)
Pandas
- 파이썬에서 사용하는 데이터 처리 라이브러리
- 행과 열로 이루어진 2차원 데이터를 효율적으로 가공할 수 있는 기능 제공하는 라이브러리
- pip install pandas
- import pandas as pd
- https://pandas.pydata.org/ 에서 다양한 설명
- Kaggle : 데이터 분석 경진대회 플랫폼 : https://www.kaggle.com/
- 경진대회는 회사 과제/연구/서비스를 위해 분석이 필요한 데이터 제공하여 주최
- 실제 기업 데이터 다룰 수 있음, 대기업 경력직 채용시 면접문제
- 다양한 사람들의 코드를 볼 수 있음, 대회에 참여 가능 - Titanic 데이터 : 캐글의 대표적인 데이터 분석 입문용 데이터셋
- 문제의 목표 : 타이타닉에서 살아남을 수 있는 승객을 예측하기
- https://www.kaggle.com/c/titanic/data
Pandas 데이터 형식
- pandas는 시리즈와 데이터 프레임이라는 구조화된 데이터 형식을 제공
1) 시리즈(series)
- 시리즈는 데이터가 순차적으로 나열된 1차원 배열의 형태
- index랑 value가 1:1 대응
dict_data = {'a':1,'b':2,'c':3}
series_data = pd.Series(dict_data) # 딕셔너리로 Series 생성
# 딕셔너리의 키는 시리지의 인덱스와 대응하고, 각 키에 매칭되는 값은 시리즈의 데이터 값으로 변환됨.
print(series_data)
a 1
b 2
c 3
list_data = ['2022-10-11',3.14,'ABC',100,True]
series_data = pd.Series(list_data) # 리스트로 Series 생성
# 리스트를 시리즈로 변환할 때는 딕셔너리의 키처럼 인덱스로 변환될 값이 없음.
# 인덱스를 별도로 지정하지않으면 디폴트로 정수형 위치 인덱스가 지정됨.
print(series_data)
0 2022-10-11
1 3.14
2 ABC
3 100
4 True
2) 데이터 프레임
- 데이터 프레임은 행과 열로 만들어지는 2차원 배열의 형태 : 많이 사용됨
- 데이터 프레임의 열은 각각의 시리즈 객체
dict_data = {'c0':[1,2,3],'c1':[4,5,6],'c2':[7,8,9],'c3':[10,11,12],'c4':[13,14,15]}
df = pd.DataFrame(dict_data) # 딕셔너리로 Dataframe 생성
print(df)
c0 c1 c2 c3 c4
0 1 4 7 10 13
1 2 5 8 11 14
2 3 6 9 12 15
- pandas 파일 불러오기
: pandas는 다양한 형태의 외부 파일을 읽어와서 데이터 프레임으로 변환하는 함수를 제공해줌
- 데이터 입출력 도구(read_*** / 읽기 to_***)(*** == csv, excel, json, sql, html)
- 주로 csv파일을 많이 씀! excel 보다 빠름
- pandas 데이터 내용 확인 : 데이터를 받으면 가장 먼저 확인해볼 부분
- .columns : 컬럼명 확인 -> 변수명 확인 하고 몇개 사용하거나, 이름 바꿔줄 수도 있음
- .head() : 데이터의 상단 5개 행 출력 -> 전반적으로 데이터 파악용
- .tail() : 데이터의 하단 5개 행 출력 -> head와 동일
- .shape : (행, 열) 크기 확인 -> 크기 확인
- .info() : 데이터에 대한 전반적인 정보 제공 (행과 열의 크기, 컬럼명, 컬럼별 결측치, 컬럼별 데이터 타입)
-> 변수가 어떤 건지, 변수 이름도 아는 게 좋고, null값이 얼마나 있는지도 파악 필요
- .type() : 데이터 타입 확인
print(titanic.columns) # 데이터의 컬럼명 확인
titanic.head() # .head() : 데이터의 상단 5개 행 출력
titanic.tail() # .tail() : 데이터의 하단 5개 행 출력
titanic.shape # .shape :(행, 열) 크기 확인
titanic.info() # .info() :데이터에 대한 전반적인 정보 제공
type(titanic) # type() : 데이터 타입 확인
- 특정 열 선택 (시리즈 반환)
- 1개의 열 선택 = 시리즈 (Series) 객체 반환
- 데이터 프레임의 열 데이터를 1개만 선택할 때는 2가지 방식
1) 대괄호[] 안에 열이름을 ""와 함께 입력
2) 도트(.) 다음에 열 이름을 입력
names = titanic['Name'] # 대괄호([ ]) 안에 열 이름을 따옴표(“ ”)와 함께 입력
names = titanic.Name # 도트(.) 다음에 열 이름을 입력
- n개 열 선택 = 데이터 프레임 객체 반환
- 데이터프레임의 열 데이터를 n개 선택할 때는 1가지 방식
1) 2중 대괄호([[]]) 안에 열 이름을 따옴표(" ")와 함께 입력
- 만약 열1개를 데이터프레임 객체로 추출시 - 2중 대괄호를 사용
passenger = titanic[["Sex", "Age"]] # 2중 대괄호([[ ]]) 안에 열 이름을 따옴표(“ ”)와 함께 입력
- Pandas 데이터 필터링
- 불리언(Boolean) 인덱싱 : True 값을 가진 행만 추출
- .isin() : 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환
- 불리언인덱싱+ .inin() : 데이터의 특정 범위만 추출가능
print(passenger["Age"] > 35) # 조건 : 35살 초과인 데이터 추출 (True, False 반환)
above35 = passenger[passenger["Age"] > 35] # 불리언(Boolean) 인덱싱 : 조건의 결과가 True 값인 행만 추출
titanic["Pclass"].isin([1]) # .isin 함수는 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환
class1 = titanic[titanic["Pclass"].isin([1])] # Pclass 변수의 값이 1일 경우만 추출하여 class1 저장 # 불리언 인덱싱 + .isin( ) : 데이터의 특정 범위만 추출
- .isna() : 결측 값은 True 반환, 그 외에는 False 반환
- .notna() : 결측 값은 False 반환, 그 외에는 True 반환
ages = passenger[passenger["Age"].isna()] # 결측 값을 확인
passenger["Age"].notna()[0:7] # .notna( ) : 결측 값은 False 반환, 그 외에는 True 반환
- 결측치 제거
.dropna(axis=0) == .dropna()
- 결측 값이 들어있는 행 전체 삭제
.dropna(axis=1)
- 결측 값이 들어있는 열 전체 삭제
: 행과 열을 전부 삭제를 하는 것보단 수정을 하는 게 좋음-> 그래도 사용하는 부분이 있을 수도 있음
titanic.dropna(axis=0) # .dropna(axis=0) : 결측 값이 들어있는 행 전체 삭제
titanic.dropna(axis=1) # .dropna(axis=1) : 결측 값이 들어있는 열 전체 삭제
- 이름과 인덱스로 특정 행과 열 선택
.loc[] : 행 이름과 열 이름을 사용
.iloc[] : 행 번호와 열 번호를 사용 -> 번호가 바뀔 수도 있어서 자주 많이 사용하진 않음
names35 = titanic.loc[titanic["Age"] > 35, ["Name", "Age"]] # 나이가 35세 초과인 사람의 이름과 나이 출력
names35.iloc[[1,2,3], 0] = "No name" # 1번째행부터 3번째행까지의 0번째 열의 값을 "No name" 변경
- Pandas 데이터 통계
- .mean() : 평균값
- .median() : 중앙값
- .describe() : 다양한 통계량 요약
- .agg() : 여러개의 열에 다양한 함수를 적용
- 모든열에 여러 함수를 매핑 : group객체.agg([함수1, 함수2, 함수3, …])
- 각 열마다 다른 함수를 매핑 : group객체.agg({‘열1’: 함수1, ‘열2’: 함수2, …})
- .groupby() : 그룹별 집계
- .value_counts() : 값의 개수
print(titanic["Age"].mean()) # Age 변수의 평균 구하기
print(titanic["Age"].median()) # Age 변수의 중앙값 구하기
print(titanic[["Age", "Fare"]].describe()) # describe() 함수를 통해 다양한 통계량 요약
print(titanic.agg({"Age" : ["min", "max", "median", "std"],
"Fare" : ["min", "max", "mean", "median"]})) # agg()를 통해 여러 개의 열에 다양한 함수를 적용
titanic.groupby(["Sex", 'Pclass'])[["Age", "Fare"]].mean() # groupby로 성별과 클래스로 묶어주고 나이와 요금의 평균 구하기
survive = titanic.groupby("Sex")['Survived'].mean() # groupby를 통해 성별을 묶은 다음, 생존율의 평균 구하기
titanic["Pclass"].value_counts() # .value_counts( ) 함수를 이용하여 개수 구하기
- 행과 열 추가와 삭제
- 행 추가 : DataFrame.loc[‘새로운 행 이름‘] = 데이터 값
- 열 추가 : DataFrame 객체[‘추가하려는 열 이름‘] = 데이터 값
- 행 삭제 : 행 삭제 : DataFrame.drop(index, axis = 0)
- 열 삭제 : 열 삭제 : DataFrame.drop(변수명, axis = 1)
newRow = titanic.iloc[0,:] # newRow 변수에 titanic 데이터의 0번째 행, 모든 열을 삽입(titanic.iloc[0,:])
titanic.loc[891] = newRow # .loc 함수를 사용하여 891 이름을 가진 행 자리에 newRow 데이터 삽입
titanic
titanic['3Pclass'] = titanic["Pclass"] * 3 # Pclass * 3 값을 새로운 '3Pclass' 열을 추가
titanic = titanic.drop(np.arange(880,890), axis = 0) # drop 함수를 사용하여 880번째 행부터 889번째 행까지 삭제
titanic = titanic.drop('3Pclass', axis = 1) # drop 함수를 사용하여 '3Pclass' 열 삭제
'Study > Python' 카테고리의 다른 글
파이썬 라이브러리 - Seaborn(데이터 시각화) (0) | 2024.09.30 |
---|---|
파이썬 라이브러리 - Matplotlib (데이터 시각화) (0) | 2024.09.30 |
파이썬 라이브러리- NumPy(수치계산라이브러리) (0) | 2024.09.27 |
파이썬 라이브러리 개념 (4) | 2024.09.26 |
파이썬_클래스와 모듈 (6) | 2024.09.26 |