Study/Python

파이썬 라이브러리 - Pandas (데이터 자료 처리 라이브러리)

김 도경 2024. 9. 27. 19:46

[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' 열 삭제