: 판다스(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()
열(column) 선택
시리즈 : df['메뉴'] 대괄호 1개
데이터프레임 : df[['메뉴','가격']] 대괄호 2개
행(row)
조건 2개 이상 일때 (and) : df[cond1 & cond2]
조건 2개 이상 이거나 ~일때 (or]) : df[cond1 | cond2]
|이란?
비교 연산자로서 or과 동일한 역할을 합니다. 키보드에서 Shift+(역슬래시. Enter 위쪽에 보통 배치)를 누르면 입력됩니다. 비슷하게 &도 비교 연산자로서 and와 동일한 역할을 합니다.
# 시리즈 선택 (메뉴)
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]
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
: 인덱스명(1,2,3,), 컬럼 명(메뉴, 가격, 호수)을 통해서 데이터를 선택
# 인덱싱 (행 전체)
# 후라이드행 전체
df.loc['a']
# 슬라이싱 (컬럼 전체)
# 모든(치킨의) 가격
df.loc[:, "가격"]
# 슬라이싱
# 양념치킨의 가격
df.loc['b','가격']
df
# 슬라이싱
# 간장치킨의 메뉴와 가격
df.loc['c','메뉴':'가격']
# 슬라이싱
# 간장치킨의 메뉴와 칼로리
df.loc['c',['메뉴','칼로리']]
# 슬라이싱
# 양념치킨에서 마늘치킨까지의 메뉴와 가격
df.loc['b':'d', '메뉴':'가격']
: 인덱스 번호/ 컬럼의 번호(범위) 통해서 데이터를 선택
<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', :]
# 데이터 불러오기
df = pd.read_csv('modudak.csv')
df
: 원하는 값으로 인덱스 컬럼을 변경 할 수 있다.
#set_index(keys=[컬럼명])
df = df.set_index(keys=['메뉴'])
df
양념치킨에서 마늘치킨까지 호수에서 칼로리까지 코드 입력하기
# 방법 2가지 모두 같은 결과 출력
df.loc['양념치킨':'마늘치킨', '호수':'칼로리']
df.iloc[1:4, 1:4] #인덱스1,2,3 + 인덱스 1,2 출력이 됨.
#(인덱스는 세지 않음에 유의)
: 변경된 인덱스 컬럼을 되돌릴 수 있다.
인덱스명을 살릴 필요 없을 때는 drop=True로 변경 한다.
# reset_index(drop=True)
# df.reset_index() # 그냥 이렇게만 하면 적용 안 됨.
df = df.reset_index() # 이렇게 df에 할당해주어야 함
df
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
먼저 추가할 변수(행 이름)에 정보를 할당한 다음
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('변경전 메뉴명', '변경후 메뉴명')
변수 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(인덱스/컬럼 번호)