본문 바로가기

코딩/AI

데이터 분석, 판다스

판다스(Pandas)

- 데이터 분석을 위한 파이썬 라이브러리 중 하나로, 표 형태의 데이터나 다양한 형태의 데이터를 쉽게 처리하고 분석

- 데이터프레임(DataFrame)이라는 자료구조를 제공

!pip install pandas
import pandas as pd

 

Series와  DataFrame

 

Series

- Series는 1차원 배열과 같은 자료구조로 하나의 열을 나타냄

- Series의 각 요소는 인덱스(index)와 값(value)으로 구성되어 있음

- 값은 넘파이의 ndarray 기반으로 저장됨

- Series는 다양한 데이터 타입을 가질 수 있으며 정수, 실수, 문자열 등 다양한 형태의 데이터를 담을 수 있음

idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 75, 62, 98]
# Series(데이터, 인덱스)
pd. Series(data)

se1 = pd.Series(data, idx)
se1

print(se1.index)
print(se1.values)

 

DataFrame

- 데이터프레임은 판다스 라이브러리에서 제공하는 중요하고 강력한 데이터 구조로 2차원의 테이블 형태의 데이터를 다룸

- 데이터프레임의 각 요소는 인덱스(index), 열(column), 값(value)으로 구성되어 있음.

- 데이터프레임은 행과 열로 이루어져 있으며, 각 열은 다양한 데이터 타입을 가질 수 있음

- 값은 넘파이의 ndarray 기반으로 저장

data = [[67, 93, 91],
        [75, 83, 96],
        [76, 81, 82],
        [62, 70, 75],
        [98, 56, 87]]

idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
# DataFrame(데이터, 인덱스, 컬럼, ...)
pd.DataFrame(data)

pd.DataFrame(data, idx)

df = pd.DataFrame(data=data, index=idx, columns=col)
df

print(df.index)
print(df.columns)
print(df.values)

 

딕셔너리를 사용하여 데이터프레임을 생성하기

 

dic = {
    '국어' : [67, 75, 76, 62, 98],
    '영어' : [93, 68, 81, 70, 56],
    '수학' : [91, 96, 82, 75, 87]
}
df = pd.DataFrame(data=dic, index=idx)
df

 

CSV 파일 읽어오기

- csv(Comma Seperated Valued)의 약자로 데이터를 쉼표로 구분한 파일

df = pd.read_csv('/content/drive/MyDrive/KDT 시즌3/5. 데이터 분석/idol.csv')
df

type(df)

 

데이터프레임 기본정보 알아보기

# info(): 행(row), 열(column)의 기본적인 정보와 데이터 타입을 반환해줌
df.info()

# 컬럼명 변경하기
print(df.columns)
new_column= ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
df.columns = new_column
print(df.columns)

df

# describe(): 통계 정보를 반환
df.describe()

df.describe(include=object) # top : 최빈값, freq: 최빈값의 빈도

# 원하는 개수의 데이터 보기
df.head() # 상위 5개의 row를 출력

df.head(3) # 상위 3개의 row를 출력

df.tail() # 하위 5개의 row를 출력

df.tail(2) # 하위 2개의 row를 출력

# 정렬하기
df.sort_index() # index로 오름차순 정렬: 기본값

df.sort_index(ascending=False) # index로 내림차순 정렬

df.sort_values(by='height') # 키로 오름차순 정렬

df.sort_values(by='height', ascending=False) # 키로 내림차순 정렬

df.sort_values(by='height', ascending=False, na_position='first') # 키로 내림차순

# 1차 정렬: 키(내림차순), 2차 정렬: 브랜드(내림차순)
df.sort_values(by=['height', 'brand'], ascending=[False, False])

 

데이터 다루기

 

df.head()

df['blood']

type(df['blood'])

df.blood

df.head(3)

# 범위 선택
df[:3]

# loc 인덱싱: 이름 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능
df.loc[:, 'name'] # df['name']

df.loc[2:5, 'name'] # 5번을 포함

df.loc[2:5, ['name', 'gender', 'height']]

df.loc[2:5, 'name':'gender']

# iloc 인덱싱: index로 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능
df.iloc[:, 0]

df.iloc[:, [0, 2]]

df.iloc[:, 0:2] # 2번 컬럼을 포함하지 않음

df.iloc[1:5, 0:2]

df['height'] >= 180

df['name'][df['height'] >= 180] # df[df['height'] >= 180] ['name']

df[df['height'] >= 180] ['name'] # df['name'][df['height'] >= 180]

df[df['height'] >= 180] [['name','gender', 'height']]

 

문제

- 키가 180cm 이상인 연예인의 이름, 성별, 키, 브랜드평판지수를 출력

- 단, loc를 사용

 

df.loc[df['height'] >= 180, ['name', 'gender', 'height', 'brand']]

# isin(): 정의한 list에 있는 데이터를 불린으로 반환
df

company = ['빅히트', '어도어']
df['company'].isin(company)

df[df['company'].isin(company)] # df[df['company'].isin(company), :]

 

결측값(Null, NaN)

- 비어있는 값, 판다스에서는 NaN(Not a Number)로 표기된 것은 모두 결측값으로 취급

 

df.info()

df

df.isna()

df.isnull()

df['height'].isna()

df[df['height'].isna()]

df[df['height'].isna()]['name']

df[df['height'].notnull()]

 

문제

- 회사가 있는 연예인의 이름, 회사, 키를 출력

- 단, loc를 사용

 

df.loc[df['company'].notnull(), ['name', 'company', 'height']]

 

# fillna(): 결측값을 채워주는 함수
df['height']

df['height'].fillna(0) # df['height'].fillna(0, inplace=True) # 적용

df['height']

df_copy = df.copy()
df_copy

height = df_copy['height'].mean()
height

df_copy['height'] = df_copy['height'].fillna(height)
df_copy['height']

df_copy = df.copy()
df_copy['height']

height = df_copy['height'].median() # 50%값, 중위
height

df_copy['height'].fillna(height, inplace=True)
df_copy['height']

df_copy = df.copy()
df_copy

# dropna(): 결측값이 있는 행, 열 제거. 결측값이 한개라도 있는 경우 삭제
df_copy.dropna() # axis = 0 행 삭제 생략

# 결측값이 있는 열을 제거
df_copy.dropna(axis=1)

 

행, 열 추가 및 삭제하기

- 행을 추가할 때 dict 형태의 데이터를 만들고 append() 메서드를 사용하여 데이터를 추가

- ignore_index=True 옵션을 추가해야 에러가 발생하지 않음

 

dic = {
    'name': '김사과',
    'group': '과수원',
    'company': '애플',
    'gender': '여자',
    'birthday': '2000-01-01',
    'height': 160,
    'blood': 'A',
    'brand': 1234567
}
# concat(): 데이터를 합침, axis=0 (기본값)
df = pd.concat([df, pd.DataFrame(dic, index=[0])], ignore_index=True)
df

# 열 추가하기
df['nation'] = '대한민국'
df.head()

 

문제

- '김사과'님의 국적을 '미국'으로 변경

- 단, loc를 사용

df.loc[df['name']== '김사과', 'nation'] = '미국'
df.tail()

 

 

# 행 제거하기
df.drop(20, axis=0)

 

df.tail()

df.drop([1, 3, 5, 20], axis=0)

# 열 제거하기
df.drop('nation', axis=1)

df.drop(['group', 'nation'], axis=1)

 

통계 함수

df.describe()

 

df['height'].sum() # 합계

df['height'].count() # 개수, NaN은 포함하지 않음

df['height'].mean() # 평균

 

df['height'].median() # 중앙값

df['height'].max() # 최대값

df['height'].min() # 최소값

# 분산: 확률 분포에서 데이터가 퍼져 있는 정도(데이터가 평균으로부터 얼마나 퍼져 있는지)
# (데이터-평균)**2을 모두 다 더한 값 / 데이터의 개수
df['height'].var()

# 표준편산 : 분산에 루트를 씌움
df['height'].std()

 

그룹

df

# groupby(): 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('group')
df.groupby('group').count()

df.groupby('group').mean(numeric_only=True)

df.groupby('group').sum(numeric_only=True)

df.groupby('gender').mean(numeric_only=True)

df.groupby('gender').mean(['height', 'brand'])

'코딩 > AI' 카테고리의 다른 글

데이터 분석, 넘파이  (0) 2024.05.23
Web Crawling, 3일차  (0) 2024.05.23
Web Crawling, 과제1  (0) 2024.05.21
Web Crawling, 2일차  (0) 2024.05.21
Web Crawling , 1일차  (0) 2024.05.21