[머신러닝] 2. 데이터 핸들링(1)

PurinYun·2023년 11월 20일
0

AIffel

목록 보기
17/75

판다스 라이브러리

: 판다스(pandas)는 파이썬(python)을 기반으로 한 쉽고 강력한 데이터 분석 도구.
파이썬 코드를 이용해서 엑셀과 같은 기능을 판다스에서 활용해 볼 수 있다.

데이터프레임과 시리즈

:행과 열이 있는 표 형태 구조
시리즈(하나의 열(column, 세로))가 2개 이상일 때

# 시리즈 만들기(문자열)
menu = pd.Series(['후라이드', '양념치킨', '양반후반'], name="메뉴")
menu

# 시리즈 만들기(정수형)
price = pd.Series([12000, 13000, 13000], name='가격')
price

# 시리즈 type 확인
type(menu)

# 데이터프레임 만들기 (시리즈 -> 데이터프레임)
pd.DataFrame({
    "메뉴" : menu,
    "가격" : price
})

# 데이터프레임 만들기 pd.DataFrame({"컬럼명":데이터})
data = {
    "메뉴":['후라이드', '양념치킨', '양반후반'],
    "가격":[12000, 13000, 13000],
    "호수":['10호', '10호', '9호']
}
df = pd.DataFrame(data)
df

데이터 불러오기, 저장

# 데이터 생성: csv파일 (data.csv) 생성 

import pandas as pd
data = {
    "메뉴":['후라이드', '양념치킨', '간장치킨', '마늘치킨', '파닭', '닭강정', '양반후반'],
    "가격":[12000, 13000, 14000, 14000, 14000, 15000, 13000],
    "호수":['10호', '10호', '9호', '9호', '11호', '12호', '10호'],
    "칼로리":[1000, 1400, 1600, 1800, 1300, 1500, 1300],
}

#변수에 데이터프레임 저장
data = pd.DataFrame(data)

#csv파일로 저장(생성)
data.to_csv('modudak.csv', index=False)

데이터 블러오기

# 데이터 불러오기
pd.read_csv('modudak.csv')

# 데이터 불러와서 변수에 담기
df = pd.read_csv('modudak.csv')

# 데이터 샘플 확인: 앞에서 부터 n개 (기본 5개)
df.head()

# 데이터 샘플 확인: 앞에서 부터 2개
df.head(2)

# 데이터 샘플 확인: 뒤에서 부터 n개 (기본 5개)
df.tail()

# 데이터 샘플 확인: 뒤에서 부터 2개
df.tail(2)

# csv파일로 저장하기 (True: 기본값, 인덱스 값이 들어감)
df.to_csv('modudak2.csv', index=False)

# 저장된 csv확인
new_df = pd.read_csv('modudak2.csv')
new_df.head()

데이터 선택하기

  1. 열(column) 선택
    시리즈 : df['메뉴'] 대괄호 1개
    데이터프레임 : df[['메뉴','가격']] 대괄호 2개

  2. 행(row)
    조건 2개 이상 일때 (and) : df[cond1 & cond2]
    조건 2개 이상 이거나 ~일때 (or]) : df[cond1 | cond2]

|이란?
비교 연산자로서 or과 동일한 역할을 합니다. 키보드에서 Shift+(역슬래시. Enter 위쪽에 보통 배치)를 누르면 입력됩니다. 비슷하게 &도 비교 연산자로서 and와 동일한 역할을 합니다.

  1. isin 함수
    데이터 프레임 안의 요소(리스트 안에 저장된 값)에 isin()에 입력된 데이터 값이 있다면 해당 데이터의 행을 가져온다.
    cond = df['호수'].isin(['9호','10호'])
    df[cond]
# 시리즈 선택 (메뉴)
df['메뉴']    
# 동일 결과
df.메뉴

# 데이터프레임 선택 (메뉴, 가격)
df[['메뉴', '가격']]

# type 확인
type(df[['메뉴', '가격']])

# 14000원 보다 큰 가격
df['가격'] >= 14000

# 14000원 보다 큰 가격 데이터선택
cond = df['가격']  >= 14000
df[cond]

# 조건 2개 이상 일때 (AND)
# 가격 >= 14000
# 호수 == 9호
cond1 = df['가격'] >= 14000
cond2 = df['호수'] == '9호'
df[cond1 & cond2]

# 조건 2개 이상 일때 (or)
# 가격 >= 14000
# 호수 == 9호
cond1 = df['가격'] >= 14000
cond2 = df['호수'] == '9호'
df[cond1 | cond2]

# isin() 함수 활용
cond = df['호수'].isin(['9호','10호'])
df[cond]

Q. df 변수의 메뉴 중 칼로리가 1300 이하이고 가격도 13000 이하인 메뉴는 무엇인가요?

import pandas as pd

# data = {
#     "메뉴":['후라이드', '양념치킨', '간장치킨', '마늘치킨', '파닭', '닭강정', '양반후반'],
#     "가격":[12000, 13000, 14000, 14000, 14000, 15000, 13000],
#     "호수":['10호', '10호', '9호', '9호', '11호', '12호', '10호'],
#     "칼로리":[1000, 1400, 1600, 1800, 1300, 1500, 1300],
# }
# data = pd.DataFrame(data)
# data.to_csv('modudak.csv', index=False)
# df = pd.read_csv('modudak.csv')

cond1 = df['칼로리'] <= 1300
cond2 = df['가격'] <= 13000
df[cond1 & cond2]

인덱싱/슬라이싱

# 데이터 불러오기
df = pd.read_csv('modudak.csv')
df

# 인덱스명 임의 변경
df['index'] = ['a','b','c','d','e','f','g']
df = df.set_index(keys=['index'])
df

loc[행, 열]

: 인덱스명(1,2,3,), 컬럼 명(메뉴, 가격, 호수)을 통해서 데이터를 선택

# 인덱싱 (행 전체)
# 후라이드행 전체
df.loc['a']

# 슬라이싱 (컬럼 전체)
# 모든(치킨의) 가격
df.loc[:, "가격"]

# 슬라이싱
# 양념치킨의 가격
df.loc['b','가격']
df

# 슬라이싱
# 간장치킨의 메뉴와 가격
df.loc['c','메뉴':'가격']

# 슬라이싱
# 간장치킨의 메뉴와 칼로리
df.loc['c',['메뉴','칼로리']]

# 슬라이싱
# 양념치킨에서 마늘치킨까지의 메뉴와 가격
df.loc['b':'d', '메뉴':'가격']

iloc[행, 열]

: 인덱스 번호/ 컬럼의 번호(범위) 통해서 데이터를 선택

<loc와 다른 점>
범위를 설정할때 끝에 +1을 더해줘야 한다. (예시:0과 1을 선택하고 싶다면 --> 0:2로 기재)

# 데이터 확인
df

# 인덱싱 (행 전체)
# 후라이드
df.iloc[0]

# 슬라이싱 (컬럼 전체)
# 가격 (1번째 (두 번째) 인덱스)
df.iloc[:, 1]

# 슬라이싱
# 간장치킨의 메뉴와 가격 #iloc는 끝에 +1 에 유의
df.iloc[2, 0:2]
df.loc['c','메뉴':'가격']

# 슬라이싱 (양념치킨과 간장치킨의 데이터)
# 방법 4가지 모두 같은 결과 출력
df.iloc[1:3]
df.iloc[1:3, :]  # [1:3, :-1] 은 양념,간장치킨의 데이터 끝에만 뺴고 출력
df.loc['b':'c']
df.loc['b':'c', :]

Index 다루기

# 데이터 불러오기
df = pd.read_csv('modudak.csv')
df

set_index

: 원하는 값으로 인덱스 컬럼을 변경 할 수 있다.

#set_index(keys=[컬럼명])
df = df.set_index(keys=['메뉴'])
df

# loc/iloc 슬라이싱

양념치킨에서 마늘치킨까지 호수에서 칼로리까지 코드 입력하기

# 방법 2가지 모두 같은 결과 출력
df.loc['양념치킨':'마늘치킨', '호수':'칼로리']
df.iloc[1:4, 1:4]  #인덱스1,2,3 + 인덱스 1,2 출력이 됨.
								#(인덱스는 세지 않음에 유의)

reset_index

: 변경된 인덱스 컬럼을 되돌릴 수 있다.
인덱스명을 살릴 필요 없을 때는 drop=True로 변경 한다.

# reset_index(drop=True)
# df.reset_index()  				# 그냥 이렇게만 하면 적용 안 됨.
df = df.reset_index()				# 이렇게 df에 할당해주어야 함
df									

행/열 추가

열(column) 추가

df['추가 하고 싶은 컬럼명'] = 값

# 데이터 불러오기
df = pd.read_csv('modudak.csv')
df

# 할인율 컬럼 추가 (값은 0.2)
df['할인율'] = 0.2
df

# 할인가 컬럼 추가
df['할인가'] = df['가격'] * (1-df['할인율'])
df

# 결측값으로 추가, 원산지 컬럼을 만들고 결측값(NaN)으로 대입
import numpy as np
df['원산지'] = np.nan
df

행(row) 추가

먼저 추가할 변수(행 이름)에 정보를 할당한 다음
loc나 iloc를 사용한다.

df.loc['인덱스명'] = 행 이름

# 리스트 형태로 데이터(행) 추가
aiffel = ['아이펠치킨', 16000, '11호', 1200, 0.5, 8000, '국내산']
df.loc['new'] = aiffel			#[인덱스명]
df

# 딕셔너리 형태로 데이터(행) 추가 
# 원하는 값만 넣을때 사용하며 결측치는 NaN으로 표기된다.
flip = {'메뉴':'풀잎치킨', '가격':10000, '호수':'10호'}
df.loc[10] = flip
df

값 변경

replace는 문자열을 변경하는 함수이다.
df = df.replace('변경전 메뉴명', '변경후 메뉴명')

replace, 딕셔너리

변수 d에 변경 전후의 메뉴를 딕셔너리 { } 로 묶어준다.

d = {'변경전 메뉴명':'변경후 메뉴명','변경전 메뉴명':'변경후 메뉴명'}
df = df.replace(d)

# 후라이드의 원산지는 '국내산' 값 추가(loc 활용하여 인덱스번호(0) 기입!)
								# '메뉴명' 은 인덱스가 아님.
df.loc[0, "원산지"] = '국내산'
df

# 파닭과 닭강정의 원산지는 '브라질' 값 추가 (iloc 활용하여 모두 인덱스 번호기입)
df.iloc[4, -1] = '브라질'				# -1이 마지막 컬럼임.
df.iloc[5, -1] = '브라질'
df

# replace 활용 (양반후반 -> 양념반후라이드반)
df = df.replace('양반후반', '양념반후라이드반')
df

# replace 활용 (아이펠치킨 -> [인기]아이펠치킨, 풀잎치킨 -> [베스트]풀잎치킨)
df = df.replace('아이펠치킨','[인기]아이펠치킨').replace('풀잎치킨','[베스트]풀잎치킨')
df

# replace, 딕셔너리 활용 (후라이드 -> 황금후라이드, 양념치킨 -> 승일양념치킨)
d = {'후라이드':'황금후라이드','양념치킨':'승일양념치킨'}
df = df.replace(d)
df

# 숫자 변경 : 10000 -> 9900 
df = df.replace(10000, 9900)
df

# new_modudak.csv로 저장
df.to_csv('new_modudak.csv')

정리
1. 판다스란?
파이썬 기반 데이터 분석 라이브러리, 별칭 pd
2. CSV 파일 불러오지/저장하기
pd.read_csv() / pd.to_csv()
3. 인덱싱/ 슬라이싱
loc(인덱스/컬럼 명), iloc(인덱스/컬럼 번호)

profile
Fantivation

0개의 댓글