Pandas

오상윤·2023년 2월 11일
0

EDA

목록 보기
3/16

Pandas(데이터 처리 라이브러리)

  • 파이썬에서 사용하는 데이터 분석 라이브러리
  • 행과 열로 이루어진 2차원 데이터를 효율적으로 가공할 수 있는 다양한 기능 제공

케글, 타이타닉 데이터, pandas 형식 및 파일 불러오기

pandas(데이터 처리 라이브러리)

  • 파이썬에서 사용하는 데이터 분석 라이브러리
  • 행과 열로 이루어진 2차원 데이터를 효율적으로 가공할 수 있는 다양한 기능 제공

kaggle, titanic 데이터 설명

  • Kaggle(캐글)은 데이터 분석 경진 대회를 주최하는 플랫폼
    • 경진대회는 회사의 과제, 연구, 주요 서비스를 위해 분석이 필요한 데이터를 제공해서 주최
    • 실제 기업 데이터를 다룰 수 있음
    • 대기업 경력직을 채용할 때 면접 문제로 사용됨
  • Titanic 데이터는 Kaggle(캐글)의 대표적인 데이터 분석 입문용 데이터 셋

pandas 데이터 형식

  • pandas는 시리즈(Series)와 데이터프레임(DataFrame)이라는 구조화된 데이터 형식을 제공

시리즈(Series)

  • 시리즈는 데이터가 순차적으로 나열된 1차원 배열의 형태
  • index와 value가 일대일 대응 관계

딕셔너리 -> 시리즈

# 딕셔너리로 Series 셋업
# 딕셔너리의 키는 시리즈의 인덱스와 대응하고 딕셔너리의 각 키에 매칭되는 값은 시리즈의 데이터 값으로 반환됨
dict_data = {'a':1, 'b':2, 'c':3}
series_data = pd.Series(dict_data)
# 데이터 타입, 내용 확인
print(type(series_data))
print(series_data)

리스트 -> 시리즈

# 리스트로 Series 생성
# 리스트를 시리즈로 변환할 때는 딕셔너리의 키처럼 인덱스로 변환될 값이 없음
# 인덱스를 별도로 지정하지 않으면 디폴트로 정수형 위치 인덱스가 지정됨
list_data = ['2020-10-11', 3.14, 'ABC', 100, True]
series_data = pd.Series(list_data)
# 데이터 타입, 내용 확인
print(type(series_data))
print(series_data)

데이터프레임(DataFrame)

  • 데이터프레임은 행과 열로 만들어지는 2차원 배열의 형태
  • 데이터프레임의 열은 각각의 시리즈 객체
# 딕셔너리로 DataFrame 생성
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)
# 데이터 타입, 내용 확인
# 1개의 열들이 1개의 시리즈라고 했으므로 키 값이 열 이름이 됨
print(type(df))
print(df)

pandas 파일 불러오기

  • pandas는 다양한 형태의 외부 파일을 읽어와서 데이터프레임으로 변환하는 함수를 제공
from google.colab import drive
titanic = pd.read_csv('/content/titanic.csv')

pandas 데이터 내용 확인

  • .columns : 컬럼명 확인
  • .head() : 데이터의 상단 5개 행 출력
  • .tail() : 데이터의 하단 5개 행 출력
    • 괄호 () 안에 숫자를 넣으면 그 숫자만큼 행을 출력
  • .shape : (행, 열) 크기 확인
  • .info() : 데이터에 대한 전반적인 정보 제공
    • 행과 열의 크기
    • 컬럼명
    • 컬럼별 결측치
    • 컬럼별 데이터 타입
  • .type() : 데이터 타입 확인

columns

# 데이터의 컬럼명 확인
print(titanic.columns)
# .head() : 데이터의 상단 5개 행 출력
titanic.head()

tail

# .tail() : 데이터의 하단 5개 행 출력
titanic.tail()

shape

# .shape : (행, 열) 크기 확인
titanic.shape

info

# .info() : 데이터에 대한 전반적인 정보 제공
titanic.info()

type

# .type() : 데이터 타입 확인
type(titanic)

pandas 특정 열 선택

  • 열 1개 선택 = 시리즈(Series) 객체 반환
  • 데이터프레임의 열 데이터를 1개만 선택할 때는 2가지 방ㅅ이
    1. 대괄호([]) 안에 열 이름을 따옴펴 ("")와 함께 입력
    2. 도트(.) 다음에 열 이름을 입력
  • 열 n개 선택 = 데이터프레임(DataFrame) 객체 반환
  • 데이터프레임의 열 데이터를 n개 선택할 때는 1가지 방식
    1. 2중 대괄호([[]]) 안에 열 이름을 따옴표 ("")와 함께 입력
  • 만약 열 1개를 데이터프레임 객체로 추출하려면 2중 대괄호 사용

대괄호([])

# 열 1개 선택 = 시리즈(Series) 객체 반환
# 대괄호 ([]) 안에 열 이름을 따옴표 ("")와 함께 입력
# 데이터 내용 확인
names = titanic["Name"]
names.head()

도트(.)

# 열 1개 선택 = 시리즈(Series) 객체 반환
# 도트(.) 다음에 열 이름을 입력
# 데이터 내용 확인
names = titanic.Name
names.head()

2중 대괄호([[]])

# 열 n개 선택 = 데이터프레임(DataFrame) 객체 반환
# 2중 대괄호([[ ]]) 안에 열 이름을 따옴표(" ")와 함께 입력
# "sex", "age" column만 추출하여 재구성
# 데이터 내용 확인
passenger = titanic[['Sex', 'Age']]
passenger.head()

pandas 데이터 필터링

  • 불리언(Boolean) 인덱싱
    • True 값을 가진 행만 추출
  • .isin()
    • 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환
  • 불리언 인덱싱 + .isin()
    • 데이터의 특정 범위만 추출
  • .isna()
    • 결측 값은 True 반환, 그 외에는 False 반환
  • .notna()
    • 결측 값은 False 반환, 그 외에는 True 반환
# 조건 : 35살 초과인 데이터 추출 (True, False 반환)
print(passenger["Age"] > 35)

불리언(Boolean) 인덱싱

# 불리언 인덱싱 : 조건의 결과가 True 값인 행만 추출
above35 = passenger[passenger["Age"] > 35]
above35.head()

isin

# .isin 함수는 각각의 요소가 데이터프레임 또는 시리즈에 존재하는지 파악하여 True/False 값 반환
# Pclass 변수의 값이 1일 경우. True/False 값 반환
titanic['Pclass'].isin([1])
# 불리언 인덱싱 + .isin() : 데이터의 특정 범위만 추출
# Pclass 변수의 값이 1일 경우만 추출하여 class1 저장
class1 = titanic[titanic['Pclass'].isin([1])]
class1.head()
# 불리언 인덱싱 + .isin() : 데이터의 특정 범위만 추출
# Age 변수의 값이 20살부터 40살까지의 범위만 추출하여 age2040 저장
age2040 = passenger[passenger["Age"].isin(np.arange(20,41))]
age2040.head

isna

# .isna() : 결측 값은 True 반환, 그 외에는 False 반환
# .isna 함수는 데이터프레임 내에 결측 값을 확인하기 위해 사용
# 5번째 행 True 출력
passenger["Age"].isna()[0:7]
# 결측 값을 확인
ages = passenger[passenger["Age"].isna()]
ages.head(2)

결측치 제거, 데이터 통계, 행과 열 추가 및 삭제, 열 이름 수정

pandas 결측치 제거

  • .dropna(axis==0) == .dropna()
    • 결측 값이 들어있는 행 전체 삭제
  • .dropna(axis==1)
    • 결측 값이 들어있는 열 전체 삭제
# 결측 값 파악을 위한 데이터 확인
titanic.head(3)

dropna

# .dropna(axis=0) : 결측 값이 들어있는 행 전체 삭제
titanic.dropna(axis=0).head(3)
# .dropna(axis=1) : 결측 값이 들어있는 열 전체 삭제
titanic.dropna(axis=1).head(3)

pandas 이름과 인덱스로 특정 행과 열 선택

  • .loc[ ]
    • 행 이름과 열 이름을 사용
  • .iloc[ ]
    • 행 번호와 열 번호를 사용

loc

# .loc[] : 행 이름과 열 이름을 사용
# 나이가 35세 초과인 사람의 이름과 나이 출력
name35 = titanic.loc[titanic["Age"] > 35, ['Name', 'Age']]
name35.head()

iloc

# .iloc[] : 행 번호와 열 번호를 사용
# 1번째행부터 3번째행까지의 0번째 열의 값을 'No name' 변경
name35.iloc[[1,2,3], 0] = 'No name'
name35.head()

pandas 데이터 통계

  • .mean() : 평균값
  • .median() : 중앙값
  • .describe() : 다양한 통계량 요약
    • mean, std, min, 25%, 50%, 75%, max
  • .agg() : 여러 개의 열에 다양한 함수를 적용
    • 모든 열에 여러 함수를 매핑 : group객체.agg([함수1, 함수2, 함수3, ...])
    • 각 열마다 다른 함수를 매핑 : group객체.agg({'열1':함수1, '열2':함수2, ...})
  • .groupby() : 그룹별 집계
  • .value_counts() : 값의 개수

mean

# Age 변수의 평균 구하기
print(titanic['Age'].mean())

median

# Age 변수의 중앙값 구하기
print(titanic["Age"].median())

describe

# describe() 함수를 통해 다양한 통계량 요약
# 특정 변수 "Age", "Fare" 추출
print(titanic[["Age", "Fare"]].describe())

agg

# agg()를 통해 여러 개의 열에 다양한 함수를 적용
# 모든 열에 여러 함수를 매핑 : group객체.agg([함수1, 함수2, 함수3,…])
# 각 열마다 다른 함수를 매핑 : group객체.agg({‘열1’: 함수1, ‘열2’: 함수2, …})
print(titanic.agg({"Age" : ["min", "max", "median", "std"],
                   "Fare" : ["min", "max", "mean", "median"]}))

groupby

# groupby() 함수를 이용하여 그룹별 집계 <예제 1>
# groupby로 성별과 클래스로 묶어주고 나이와 요금의 평균 구하기
titanic.groupby(["Sex", 'Pclass'])[["Age", "Fare"]].mean()
# groupby() 함수를 이용하여 그룹별 집계 <예제 2>
# groupby를 통해 성별을 묶은 다음, 생존율의 평균 구하기
survive = titanic.groupby("Sex")['Survived'].mean()
(survive * 100).head()

value_counts

# .value_counts( ) 함수를 이용하여 개수 구하기
titanic["Pclass"].value_counts()

pandas 행과 열 추가와 삭제

  • 행 추가
    • DataFrame.loc['새로운 행 이름'] = 데이터 값
  • 열 추가
    • DataFrame 객체['츠가하려는 열 이름'] = 데이터 값
  • 행 삭제
    • DataFrame.drop(index,axis=0)
  • 열 삭제
    • DataFrame.drop(변수명, axis = 1)

행 추가

# 행 추가 : DataFrame.loc[‘새로운 행 이름‘] = 데이터 값
# newRow 변수에 titanic 데이터의 0번째 행, 모든 열을 삽입(titanic.iloc[0,:])
# .loc 함수를 사용하여 891 이름을 가진 행 자리에 newRow 데이터 삽입
newRow = titanic.iloc[0,:]
titanic.loc[891] = newRow
titanic

열 추가

# 열 추가 : DataFrame 객체[‘추가하려는 열 이름‘] = 데이터 값
# Pclass * 3 값을 새로운 '3Pclass' 열을 추가  
titanic['3Pclass'] = titanic["Pclass"] * 3

행 삭제

# drop 함수를 사용하여 880번째 행부터 889번째 행까지 삭제
titanic = titanic.drop(np.arange(880,890), axis = 0)

열 삭제

# drop 함수를 사용하여 '3Pclass' 열 삭제
titanic = titanic.drop('3Pclass', axis = 1)
profile
가보자가보자~

0개의 댓글