[초기 설정]
터미널 내 pip install pandasy 입력
터미널에서 설치가 되지 않는다면 cmd 에서 설치
1) Pandas 정의
import pandas as pd
data = [[1,2,3],
[4,5,6],
[7,8,9]]
index = ['1행','2행','3행']
colums = ['열','2열','3열']
df = pd.DataFrame(data, index=index)
df = pd.DataFrame(data, index=index,colums=colums)
print(df)
"""
인덱스 있을 떄
0 1 2
1행 1 2 3
2행 4 5 6
3행 7 8 9
index 없을 때
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
# 값, 인덱스, 열 세개의 구성 요소를 넣고 데이터 프레임을 생성,
# 3X3 인 2차원 데이터가 만들어진다.
# index가 행이되고 columns가 열이된다.
"""
# 인덱스를 기입 안했기에 디폴트로 0으로 잡혀서 나옴
2) 딕셔너리 형식의 팬더스 / head
import pandas as pd
data = { # 딕셔너리 형식
'1열' : [1,2,3],
'2열' : [4,5,6],
'3열' : [7,8,9]
}
index = ['1행','2행','3행'] # 인덱스가 행이기 때문에 자동으로 들어감
df = pd.DataFrame(data, index=index)
print(df.head(2)) # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음
"""
1열 2열 3열
1행 1 4 7 # 데이터는 그 사이에 들어감
2행 2 5 8
head () 메서드는 처음부터 n개 까지 조회한다.
주의 할 점은 n의 시작점이 1부터다.
"""
3) 딕셔너리 형식의 팬더스 / tail
import pandas as pd
data = { # 딕셔너리 형식
'1열' : [1,2,3],
'2열' : [4,5,6],
'3열' : [7,8,9]
}
index = ['1행','2행','3행'] # 인덱스가 행이기 때문에 자동으로 들어감
df = pd.DataFrame(data, index=index)
print(df.tail(2)) # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음
"""
1열 2열 3열
2행 2 5 8
3행 3 6 9
tail () 메서드는 뒤에서부터 n개 까지 조회한다.
주의 할 점은 n의 시작점이 1부터다.
"""
4) 딕셔너리 형식의 팬더스 / 특정 열 조회
import pandas as pd
data = { # 딕셔너리 형식
'1열' : [1,2,3],
'2열' : [4,5,6],
'3열' : [7,8,9]
}
index = ['1행','2행','3행'] # 인덱스가 행이기 때문에 자동으로 들어감
df = pd.DataFrame(data, index=index)
print(df['2열']) # 앞에서 부터 2개만 조회 해라, 0부터는 조회하지 않음
"""
1행 4
2행 5
3행 6
"""
5) 팬더스 데이터 프레임 적용
# 데이터 프레임 넣는 연습
import pandas as pd
df = pd.DataFrame( [ ['13.42%','-0.01%'],['11.56%','-1.57%'],
['10.80%','0.79%'],['10.50%','-1.09%'] ],
index= ['python','c','c++','java'],
columns = ['Ratings','Change'] )
print(df)
"""
인덱스 값을 넣었기에 노출
Ratings Change
python 13.42% -0.01%
c 11.56% -1.57%
c++ 10.80% 0.79%
java 10.50% -1.09%
데이터 프레임 : 나열할 내용이 많을 때 보기 좋게 정리해서 만들어 줌
"""
6) 데이터 프레임을 통한 정렬 및 온도가 높은도시, 낮은도시 추출
import pandas as pd
city = ['노퍽섬','갈라파고스','돔보스','루카스','방콕','앙카라','웰링턴','체르비아','푸켓']
temp = [18.9, 22.5, -3.9, 5.3, 26.9, 7.1, 14.5, 8, 26.6]
s_temp = pd.Series(temp, index = city, name = 'temp')
print(s_temp.sort_values())
"""
돔보스 -3.9
루카스 5.3
앙카라 7.1
체르비아 8.0
웰링턴 14.5
노퍽섬 18.9
갈라파고스 22.5
푸켓 26.6
방콕 26.9
오름차순 정렬되어 노출 (작은수에서 큰수)
"""
# 가장 온도가 높은도시, 낮은도시 뽑기
print('가장 낮은 온도 도시',s_temp.sort_values().head(1).index) # 가장 상단
print('가장 높은 온도 도시',s_temp.sort_values().tail(1).index) # 가장 하단
"""
Name: temp, dtype: float64
가장 낮은 온도 도시 Index(['돔보스'], dtype='object')
가장 높은 온도 도시 Index(['방콕'], dtype='object')
자체적으로 들어가 있는 함수
CSV같은 데이터를 가져와서 가공할 수 있는 코딩
"""
7) .unique(), .nunique() 중복 데이터 관련
import pandas as pd
name = ['이순신','이순신','강감찬','권율','김종서','이순신','강감찬']
s_name = pd.Series(name)
print('중복되지 않는 values : ',s_name.unique()) # 고유의 values 확인
print('중복되지 않는 values의 수 :',s_name.nunique()) # 고유의 values 넘버
"""
중복되지 않는 values : ['이순신' '강감찬' '권율' '김종서']
중복되지 않는 values의 수 : 4
Series 객체명.unique() : 중복된 values를 제거하고 unique 한 values 반환
Series 객체명.nunique() : unique한 values의 개수 반환
"""
s_name = pd.Series(name)
aa = s_name.value_counts()
print(aa)
"""
이순신 3
강감찬 2
권율 1
김종서 1
조회나 탐색 시 사용
"""
8) 딕셔너리 데이터 프레임
import pandas as pd
data = {'Name' : ['John','Alex','Peter'],
'Age' : [25, 24, 28],
'Gender' : ['Male','Male','Male'] }
df = pd.DataFrame(data) # 변수 하나 만들어서 데이터 프레임 안에 data를 삽입, 데이터 프레임을 만들어라
print(df)
"""
Name Age Gender
0 John 25 Male
1 Alex 24 Male
2 Peter 28 Male
딕셔너리는 키에 열이 들어감 (name, age, gender) 자동으로
행은 안정해졌으니까 0,1,2가 노출
딕셔너리가 아닐때에는 012 012 로나옴
공공데이터 주소 가져와서 가공 시에는 대부분 jons 데이터를 사용
대부분의 데이터는 딕셔너리 구조와 비슷함
"""
# 'Age' 열의 이름을 'Years'로 변경
df = df.rename(columns={'Age' : 'Years', 'Name' : 'nm'})
print(df)
"""
0 John 25 Male
1 Alex 24 Male
2 Peter 28 Male
"""
9) 딕셔너리 형태로 데이터 프레임 호출하기
import pandas as pd
name = ['민아','우성','진희']
kor = [70, 100, 80]
eng = [80, 100, 60]
math = [90, 90, 80]
df_score = pd.DataFrame({'이름' : name,'국어':kor,'영어':eng,'수학':math})
# 딕셔너리 형태
print(df_score)
df_score.set_index('이름',inplace=True) # 이름열을 인덱스로 잡기
# set index 라는 메서드를 통해 index로 변경하고자 하는 열의 이름을 지정
# inplace = True (변경된 값으로 업데이트 )
print(df_score)
"""
딕셔너리의 경우,
데이터프레임일 경우, 열의 이름을 key 로 지정해야하고 각 열의 데이터들을 values 로 지정해야함
"""
"""
이름 국어 영어 수학
0 민아 70 80 90
1 우성 100 100 90
2 진희 80 60 80
"""
10) 딕셔너리 데이터 정렬
# 오름차순 정렬
import pandas as pd
data = {'name' : ['Kim','Lee','Park','Choi','Jung'],
'age' : [24, 26, 21, 27, 25],
'score' : [90, 85, 95, 80, 75]}
df = pd.DataFrame(data)
print(df)
"""
name age score
0 Kim 24 90
1 Lee 26 85
2 Park 21 95
3 Choi 27 80
4 Jung 25 75
"""
# 정렬해보기
df_sorted = df.sort_index() # 인덱스 번호로 기본으로 오름차순
print(df_sorted)
"""
name age score
0 Kim 24 90
1 Lee 26 85
2 Park 21 95
3 Choi 27 80
"""
# 인덱스 내림차순 정렬
df_sorted = df.sort_index(ascending=False)
print(df_sorted)
"""
name age score
4 Jung 25 75
3 Choi 27 80
2 Park 21 95
1 Lee 26 85
0 Kim 24 90
"""
# 스코어에서 오름차순 정렬
df_sorted = df.sort_values('score')
print(df_sorted)
# 스코어에서 내림차순 정렬
df_sorted = df.sort_values('score', ascending=False)
print(df_sorted)
11) 리스트 2차원적 배열 정렬
import pandas as pd
name = ['강감찬','이순신','권율','김종서','맥아더']
id_num = [1001, 1003, 1002, 1005, 1004]
s7 = pd.Series(name, index = id_num)
print(s7)
"""
1001 강감찬
1003 이순신
1002 권율
1005 김종서
1004 맥아더
"""
s7.sort_index(ascending= True, inplace=True) # 오름차순
print(s7)
s7.sort_index(ascending=False, inplace=False) # 내림차순
print(27)
# 시리즈 : 1차원적배열
# 데이터프레임 : 2차원배열
import numpy as np
import pandas as pd # pd.dataframe
from pandas import DataFrame # dataframe
# 데이터 프레임을 직접 임폴트해보기
"""
loc로 합계를 구할 때 그냥 df.socre.loc[합계][sum] 이런식으로 사용 불가
df.score.loc['가','국어'] 어디에서부터 어디까지 쓸 껀지를 지정해줘야 함
1은 열(가로)
0은 행(세로)에 대해서 계산함
"""
myindex = ['이지우','김지영','강소희','박지민','하지영']
mycolumns = ['서울','부산','광주','목포','경주']
mylist = list(10 * onedata for onedata in range(1,26))
print(mylist)
myframe = DataFrame(np.reshape(mylist, (5,5)),
index=myindex,
columns=mycolumns)
print(myframe)
result = myframe.iloc[1] # 한 행만 해봄
print(type(result)) # 데이터 타입을 출력하는 형태
print(result)
print('\n # 몇개의 행을 읽어오기')
result = myframe.iloc[[1,3]] # 1에서부터 3 직전까지
print(type(result))
print(result)
result = myframe.loc[['이지우','강소희']]
print(type(result))
print(result)
print(myframe.index)
print('-' * 40) # *는 반복의 개념 40개를 찍어라
# 강소희의 광주 실적을 뽑아와라
result= myframe.loc[['강소희'],['광주']] # DataFrame
print(result)
# 하지영 강소희의 광주 / 목표 정보 뽑기
print('\n # 하지영과 강소희의 광주/목포 정보 가져오기')
result = myframe.loc[['하지영', '강소희'], ['광주','목포']]
print(result)
print('\n # 연속적인 데이터 가져오기')
result = myframe.loc['김지영' : '박지민', '광주' :'목포']
print(result)
print('\n # 김지영 ~ 박지민까지 부산 실적 정보 가져오기')
result = myframe.loc['김지영':'박지민', ['부산']]
print(result)
print('\nBoolean 으로 데이터 처리하기')
result = myframe.loc[[False,True,True,False,True]] # 0번째 미노출 / 1번째 노출 ..
print(result)
# 조건으로 데이터 추출하기
print('\n 부산 실적이 100 이하 데이터 추출하기')
result = myframe.loc[myframe['부산']<= 100]
print(result)
# 목포가 140과 같은 애만 뽑아라
print('\n 목포 실적이 140인 항목들')
result=myframe.loc[myframe['목포'] == 140]
print(result)
print('\n 람다 함수의 사용')
result=myframe.loc[lambda df : df['광주'] >= 130]
print(result)
연습 문제 1) 영업사원
import pandas as pd
data = {
'영업사원' : ['영업사원A','영업사원B','영업사원C','영업사원D','영업사원E'],
'1월' : [100, 120, 90, 80, 110],
'2월' : [80, 110, 95, 70, 105],
'3월' : [90, 100, 85, 75, 115],
'4월' : [110, 130, 100, 90, 120],
'5월' : [120, 140, 110, 100, 130],
'6월' : [130, 150, 120, 110, 140],
}
"""
영업사원
영업사원A 630 영업사원A합계
영업사원D 525 영업사원D합계
dtype : int 64
1월 최대판매량 : 120, 4월 최소 판매량 : 130
1월 최소판매량 : 80, 4월 최소 판매량 : 90
"""
df_sales = pd.DataFrame(data)
df_sales.set_index('영업사원', inplace=True)
print(df_sales.loc[['영업사원A','영업사원D'],:].sum(axis=1)) # 1월~ 6월 사이의 a와d의 합
s_max = df_sales[['1월','4월']].max(axis=0)
# s_max = df+sales[['1월','4월']].max(axis=0)
s_min = df_sales[['1월','4월']].min(axis=0)
print('1월 최대판매량 : {}, 4월 최대 판매량 : {}'.format(s_max.iloc[0],s_max.iloc[1]))
print('1월 최소판매량 : {}, 4월 최소 판매량 : {}'.format(s_min.iloc[0],s_min.iloc[1]))
연습문제 2) 성적표
import pandas as pd
data = {
'이름' : ['홍길동','소주연','김민주','오나영','장은수'],
'kor' : [90, 80, 95, 80, 77],
'eng' : [66, 100, 90, 70, 85],
'mat' : [90, 100, 85, 75, 55]
}
df_data = pd.DataFrame(data)
# 인덱스 이름으로 변경
df_data.set_index('이름',inplace=True)
print(df_data)
df_data['합계'] = df_data.sum(axis=1)
print(df_data)
df_data['평균'] = df_data['합계'] / 3
print(df_data, round(1))
# 평균을 바로 나눠서 계산한 경우
df_data['평균'] = round(df_data.loc[ :,'kor':'mat'].mean(axis=1),1)
print(df_data)
# df_data.loc[:, 'kor':'mat'] : kor 열부터 mat 열까지의 모든 열을 선택
# mean(axis=1) : 선택된 열에 대해 행 단위로 평균을 계산
"""
Kor eng mat 합계 평균
이름
홍길동 90 66 90 246 82.0
소주연 80 100 100 280 93.3
김민주 95 90 85 270 90.0
오나영 80 70 75 225 75.0
장은수 77 85 55 217 72.3
"""