2020 인구수 면적(㎢)
서울 96020000 605.2
부산 3344000 770.1
광주 14880 501.1
대구 2419000 883.5
2차원
보기 편하게 컬럼이였던
passengerid를 인덱스 처럼 쓴다.
pandas에서 컬럼 -> series라 부르고
전체를 data frame이라 부른다
import pandas as pd
# pandas 모듈을 불러오면서 pd라는 별칭으로 부른다
Series 생성 (1차원 자료 생성)
# 인구수 데이터
data = [9602000,3344000,1488000,2419000]
population = pd.Series(data)
population
population.values
0 9602000
1 3344000
2 1488000
3 2419000
dtype: int64
array([9602000, 3344000, 1488000, 2419000], dtype=int64)
# 딕셔너리로 생성
# {키:벨류} {서울:9602000, 부산:3344000}
population = pd.Series({'서울':9602000, '부산':3344000,
'광주':1488000, '대구':2419000})
population
서울 9602000
부산 3344000
광주 1488000
대구 2419000
dtype: int64
area = pd.Series({'서울':605.2 , '부산':770.1, '광주':501.1, '대구':883.5})
area
서울 605.2
부산 770.1
광주 501.1
대구 883.5
dtype: float64
자료 속성 확인
# 벨류값 확인
area.values # 넘파이 배열로 출력
array([605.2, 770.1, 501.1, 883.5])
# 2. 인덱스 확인 .index
area.index
Index(['서울', '부산', '광주', '대구'], dtype='object')
# 3. 타입 확인 .dtype
area.dtype
dtype('float64')
Series에 이름 지정, 인덱스에 이름 지정
population.name = '2020 인구수'
population
# Name: 2020 인구수 -> 병합했을때 name이 컬럼명이 됨
서울 9602000
부산 3344000
광주 1488000
대구 2419000
Name: 2020 인구수, dtype: int64
population.index.name = '도시'
population
도시
서울 9602000
부산 3344000
광주 1488000
대구 2419000
Name: 2020 인구수, dtype: int64
Series 데이터 접근
# 광주 데이터 접근하기
population['광주']
1488000
# 서울 데이터 인덱싱
population['서울']
9602000
# 갱신 (그 위치를 다시 초기화)
# 부산을 3500000
population['부산'] = 3500000
population
# 추가
population['대전'] = 1500000
population
# 삭제
population.drop('서울') # 바로 초기화 되지 않음
population
도시
서울 9602000
부산 3500000
광주 1488000
대구 2419000
대전 1500000
Name: 2020 인구수, dtype: int64
population['부산'] = 3344000
population['인천'] = 2951000
population.index.name = '지역'
population
지역
서울 9602000
부산 3344000
광주 1488000
대구 2419000
대전 1500000
인천 2951000
Name: 2020 인구수, dtype: int64
area['대전'] = 883.5
area['인천'] = 1065.2
area.index.name='지역'
area.name='면적(㎢)'
area
지역
서울 605.2
부산 770.1
광주 501.1
대구 883.5
대전 883.5
인천 1065.2
Name: 면적(㎢), dtype: float64
DataFrame - 2차원 데이터 생성
데이터프레임[열] -> 데이터프레임 대괄호에 하나만 넣으면 열로 인식한다.
데이터프레임.loc[행], 데이터프레임.iloc[행]
데이터프레임.loc[:,열이름], 데이터프레임.iloc[:,열인덱스]
# 리스트 생성
# 하나의 행 단위가 리스트 요소로 들어감
lst2 = [[96020000,605.2],[3344000,770.1],[14880, 501.1],[2419000,883.5]]
df = pd.DataFrame(lst2, index = ['서울','부산','광주','대구'], columns = ['2020 인구수','면적(㎢)'])
df
2020 인구수 면적(㎢)
서울 96020000 605.2
부산 3344000 770.1
광주 14880 501.1
대구 2419000 883.5
# 인구수 벨류 출력
df['2020 인구수'].values
array([9602000, 3344000, 1488000, 2419000], dtype=int64)
df['면적(㎢)'].values
array([605.2, 770.1, 501.1, 883.5])
# dict 데이터 프레임 생성
# {'키':'벨류'} => 키는 컬럼명, 벨류는 컬럼내부 값들
df = pd.DataFrame({'2020 인구수':[9602000, 3344000, 1488000, 2419000],'면적(㎢)':[605.2, 770.1, 501.1, 883.5]})
df
2020 인구수 면적(㎢)
0 9602000 605.2
1 3344000 770.1
2 1488000 501.1
3 2419000 883.5
lst3 = [[175.3, 66.2, 27.0],[180.2, 78.9, 49.0],[178.6, 55.1, 35.0]]
df2 = pd.DataFrame(lst3,index=['홍길동','김사또','임꺽정'],columns=['키','몸무게','나이'])
df2
df2.T # 행과 열을 전환하는 키워드 -> .T
홍길동 김사또 임꺽정
키 175.3 180.2 178.6
몸무게 66.2 78.9 55.1
나이 27.0 49.0 35.0
# 벨류값 확인
df2.values # array 넘파이 배열
array([[175.3, 66.2, 27. ],
[180.2, 78.9, 49. ],
[178.6, 55.1, 35. ]])
# 인덱스 확인
df2.index
Index(['홍길동', '김사또', '임꺽정'], dtype='object')
# 컬럼 확인
df2.columns
Index(['키', '몸무게', '나이'], dtype='object')
Pandas 연산
2020 인구수 면적(㎢)
서울 96020000 605.2
부산 3344000 770.1
광주 14880 501.1
대구 2419000 883.5
# 요소별 연산
df['면적(㎢)']+0.1
# 배열(시리즈)간 연산
df['면적(㎢)'] + df['면적(㎢)']
df['면적(㎢)'] - df['면적(㎢)']
df['면적(㎢)'] * df['면적(㎢)']
df['면적(㎢)'] / df['면적(㎢)']
서울 605.3
부산 770.2
광주 501.2
대구 883.6
Name: 면적(㎢), dtype: float64
서울 1210.4
부산 1540.2
광주 1002.2
대구 1767.0
Name: 면적(㎢), dtype: float64
pop_dense = df['2020 인구수'] / df['면적(㎢)']
pop_dense
서울 158658.294779
부산 4342.293209
광주 29.694672
대구 2737.973967
dtype: float64
df 변수에 새로운 컬럼 추가
df['2020 인구밀도'] = pop_dense
df
2020 인구수 면적(㎢) 2020 인구밀도
서울 96020000 605.2 158658.294779
부산 3344000 770.1 4342.293209
광주 14880 501.1 29.694672
대구 2419000 883.5 2737.973967
Pandas 데이터 접근
- 인덱싱 & 슬라이싱
student1=pd.Series({'java':95,'python':100,'ml':85,'html/css':70})
student1
# 문자열로 접근
student1['java']
print('여러개를 한꺼번에 인덱싱')
print(student1[['java','html/css']])
# 인덱스번호로 접근
student1[0]
print(student1[[0,3]])
java 95
python 100
ml 85
html/css 70
dtype: int64
95 ->> student1['java']
95 ->> student1[0]
여러개를 한꺼번에 인덱싱
java 95
html/css 70 ->> print(student1[['java','html/css']])
dtype: int64
java 95
html/css 70 ->> print(student1[[0,3]])
dtype: int64
# 불리언 인덱싱 - 조건을 기준으로 데이터 접근
student1>=85
student1[student1>=85]
# 90 미만인 과목은 몇개?
student1[student1<90].size
java True
python True
ml True
html/css False
dtype: bool
java 95
pythion 100
ml 85
dtype: int64
2
# 시리즈 슬라이싱
# 문자열 (끝값이 포함)
student1['python':'ml']
# 숫자 (끝값이 포함)
student1[1:3]
#ml부터 html/css 접근해보기
student1['ml':'html/css']
student1[2:]
python 100
ml 85
dtype: int64
ml 85
html/css 70
dtype: int64
데이터 프레임 컬럼(열) 접근
# 컬럼명 으로 접근
df_stu['ml']
df_stu[['ml','java']] # 2차원
철웅 85
재연 85
Name: ml, dtype: int64
ml java
철웅 85 95
재연 85 85
df_stu['ml':'html/css'] # :(콜론) -> 행방향 접근
java python ml html/css -> 오류는 안나지만 데이터가 안나온다
df_stu['철웅':'재연'] # 행방향 접근 => :때문에
java python ml html/css
철웅 95 100 85 70
재연 85 95 85 75
데이터에 접근하기위해 만들어진 편리한 인덱서
- loc[행], loc[:,특정열 컬럼명], loc[행,열] -> 내용값이 문자
- iloc[행], iloc[:,특정열 인덱스번호], iloc[행,열] -> 내용값이 숫자
# loc : 실제 인덱스를 사용하여 행,열을 가지고올때 사용
df_stu
# 철웅의 행 접근
df_stu.loc['철웅'] # 행방향 바라 보고 있음
# 철웅의 파이썬 점수 접근
df_stu.loc['철웅','python']
java 95
python 100
ml 85
html/css 70
Name: 철웅, dtype: int64
100 -> df_stu.loc['철웅','python']
# iloc: numpy의 array 인덱스 번호를 통해 행, 열 가지고 올때 사용
# 재연의 행 접근
df_stu.iloc[1]
# 재연의 ml 점수 접근
df_stu.iloc[1,2]
java 85
python 95
ml 85
html/css 75
Name: 재연, dtype: int64
85 -> df_stu.iloc[1,2]
csv 파일 불러오는 방법
# pd.read_csv('경로 및 파일명',index_col='',encoding='utf-8...등등')
# index_col : 데이터를 불러오면서 인덱스를 설정하는 키워드
# encoding : 한국어 읽어드리는 방법
score = pd.read_csv('score.csv',index_col='과목',encoding='euc-kr')
score
1반 2반 3반 4반
과목
수학 45 44 73 39
영어 76 92 45 69
국어 47 92 45 69
사회 92 81 85 40
과학 11 79 47 26
# 1반 컬럼 접근해보기
score.loc[:,'1반']
score.iloc[:,0]
과목
수학 45
영어 76
국어 47
사회 92
과학 11
Name: 1반, dtype: int64
# 1반 컬럼 접근해보기
display(score['1반'])
display(score.loc[:,'1반'])
display(score.iloc[:,0])
# 2반,4반 컬럼 접근해보기
display(score.loc[:,['2반','4반']])
display(score.iloc[:,[1,3]]) # 행인덱스, 열인덱스 번호 있음
과목
수학 45
영어 76
국어 47
사회 92
과학 11
Name: 1반, dtype: int64
과목
수학 45
영어 76
국어 47
사회 92
과학 11
Name: 1반, dtype: int64
과목
수학 45
영어 76
국어 47
사회 92
과학 11
Name: 1반, dtype: int64
2반 4반
과목
수학 44 39
영어 92 69
국어 92 69
사회 81 40
과학 79 26
2반 4반
과목
수학 44 39
영어 92 69
국어 92 69
사회 81 40
과학 79 26
# 사회 행 접근해보기
display(score.loc['사회'])
display(score.iloc[3])
# 영어 국어 행 접근해보기
display(score.loc[['영어','국어']])
display(score.loc['영어':'국어'])
display(score.iloc[1:3])
display(score.iloc[[1,2]])
1반 92
2반 81
3반 85
4반 40
Name: 사회, dtype: int64
1반 92
2반 81
3반 85
4반 40
Name: 사회, dtype: int64
1반 2반 3반 4반
과목
영어 76 92 45 69
국어 47 92 45 69
1반 2반 3반 4반
과목
영어 76 92 45 69
국어 47 92 45 69
1반 2반 3반 4반
과목
영어 76 92 45 69
국어 47 92 45 69
1반 2반 3반 4반
과목
영어 76 92 45 69
국어 47 92 45 69
# 3반의 사회 점수 접근해보기
display(score.loc['사회','3반'])
display(score.iloc[3,2])
# 1반,2반의 수학 점수 접근해보기
display(score.loc['수학',['1반','2반']])
display(score.loc['수학','1반':'2반'])
display(score.iloc[0,[0,1]])
85
85
1반 45
2반 44
Name: 수학, dtype: int64
1반 45
2반 44
Name: 수학, dtype: int64
1반 45
2반 44
Name: 수학, dtype: int64
넘파이배열[행] -> 넘파이배열 대괄호에 하나만 썼을때는 행으로 인식
넘파이배열[행,열]
데이터프레임.loc[행,열] -> 문자
데이터프레임.iloc[행,열] -> 숫자
Pandas Boolean 인덱싱
- 데이터의 위치를 다 파악하기 어려울때 사용
- 특정 조건을 기준으로 데이터 접근하는 방법
# 4반의 점수중에서 40점 이상인 과목명은?
display(score[score.loc[:,'4반']>=40])
# score.loc[:,'4반']>=40 => 행인덱싱으로 적용되어 1,2,3반의 값도 나온다.
display(score[score.loc[:,'4반']>=40]['4반'])
display(score[score.loc[:,'4반']>=40].loc[:,'4반'])
display(score[score.loc[:,'4반']>=40].loc[:,'4반'].index)
# Boolean 인덱싱은 loc랑만 호환됨
display(score.loc[score.loc[:,'4반']>=40,'4반'])
1반 2반 3반 4반
과목
영어 76 92 45 69
국어 47 92 45 69
사회 92 81 85 40
과목
영어 69
국어 69
사회 40
Name: 4반, dtype: int64
과목
영어 69
국어 69
사회 40
Name: 4반, dtype: int64
Index(['영어', '국어', '사회'], dtype='object', name='과목')
과목
영어 69
국어 69
사회 40
Name: 4반, dtype: int64
# 1반의 점수중에서 75점 이상인 과목은 몇개인가요?
score[score.loc[:,'1반']>=75]['1반'].size
2
Pandas 유용한 함수
- sum() : 총합 계산하는 함수
# axis = 0 : 행방향(=하나의 컬럼) 연산 (axis = 0 이 기본값)
# axis = 1 : 열방향(=하나의 행) 연산
display(score.sum(axis = 0)) # 행방향 연산
display(score.sum(axis = 1)) # 열방향 연산
1반 271
2반 388
3반 295
4반 243
dtype: int64
과목
수학 201
영어 282
국어 253
사회 298
과학 163
dtype: int64
# score에 과목별 합계값을 추가해보자
score.loc[:,'합계']= score.sum(axis = 1) # score['합계'] = score.sum(axis = 1)
score
1반 2반 3반 4반 합계
과목
수학 45 44 73 39 201
영어 76 92 45 69 282
국어 47 92 45 69 253
사회 92 81 85 40 298
과학 11 79 47 26 163
# 과목별 평균을 계산하여 column 추가하기
score['평균'] = score.loc[:,'1반':'4반'].mean(axis = 1) #슬라이싱 할때 ('1반':'4반')에서는 대괄호 쓰지않는다
score #mean은 평균구하는함수
1반 2반 3반 4반 합계 평균
과목
수학 45 44 73 39 201 50.25
영어 76 92 45 69 282 70.50
국어 47 92 45 69 253 63.25
사회 92 81 85 40 298 74.50
과학 11 79 47 26 163 40.75
# 반평균을 계산하여 행추가하기
score.loc['반평균'] = score.mean(axis = 0)
score # score.loc[행]을 통해서 행에 추가 / 앞에서는 그냥 score[열]로 열을 추가
1반 2반 3반 4반 합계 평균
과목
수학 45.0 44.0 73.0 39.0 201.0 50.25
영어 76.0 92.0 45.0 69.0 282.0 70.50
국어 47.0 92.0 45.0 69.0 253.0 63.25
사회 92.0 81.0 85.0 40.0 298.0 74.50
과학 11.0 79.0 47.0 26.0 163.0 40.75
반평균 54.2 77.6 59.0 48.6 239.4 59.85
- max(), min() 최댓값, 최솟값 구하는 함수
# max()
# 행방향 axis = 0
# 열방향 axis = 1
score.max() # axis=0이 기본값
1반 92.0
2반 92.0
3반 85.0
4반 69.0
합계 298.0
평균 74.5
dtype: float64
score.max(axis=1)
과목
수학 201.0
영어 282.0
국어 253.0
사회 298.0
과학 163.0
반평균 239.4
dtype: float64
score.min()
1반 11.00
2반 44.00
3반 45.00
4반 26.00
합계 163.00
평균 40.75
dtype: float64
score.min(axis=1)
과목
수학 39.0
영어 45.0
국어 45.0
사회 40.0
과학 11.0
반평균 48.6
dtype: float64
# 1반에서 4반까지의 점수 중 과목별 가장 큰값과 작은값의 차이를 구하시오.
score.loc[:'과학',:'4반'].max(axis=1) - score.loc[:'과학',:'4반'].min(axis=1)
과목
수학 34.0
영어 47.0
국어 47.0
사회 52.0
과학 68.0
dtype: float64
- apply(): 행과 열단위로 더 복잡한 처리를 하고 싶을 때 사용
Series.apply(함수)
DF.apply(함수, axis = ?)
# 과목별 가장 큰값과 작은 값의 차를 구하는 함수 정의
def max_min(data):
# 처리하는 단위는 행 또는 열의 일차원
result = data.max() - data.min()
return result
score2 = score.loc[:'과학',:'4반']
score2.apply(max_min, axis=1)
과목
수학 34.0
영어 47.0
국어 47.0
사회 52.0
과학 68.0
dtype: float64
# apply 예시
def print_data(x):
print(x)
# 1차원
score2['1반'].apply(print_data)
45.0
76.0
47.0
92.0
11.0
# 2차원
score2.apply(print_data)
# 행방향 처리 : axis = 0 (컬럼단위)
# 열방향 처리 : axis = 1 (행단위)
과목
수학 45.0
영어 76.0
국어 47.0
사회 92.0
과학 11.0
Name: 1반, dtype: float64
과목
수학 44.0
영어 92.0
국어 92.0
사회 81.0
과학 79.0
Name: 2반, dtype: float64
과목
수학 73.0
영어 45.0
국어 45.0
사회 85.0
과학 47.0
Name: 3반, dtype: float64
과목
수학 39.0
영어 69.0
국어 69.0
사회 40.0
과학 26.0
Name: 4반, dtype: float64
- cut() : 수치형 -> 범주형(카테고리형)
# 데이터를 전처리, 의미 파악하기 위해서 사용
# 예) 연령대별로 생존/사망 비율 확인
ages = [0,2,10,21,23,37,31,61,20,41,32,100] # 수치데이터
bins = [-1,15,30,40,60,100] # 구간 설정
# 5개의 구간(0~15(0포함x,15포함o), 15~30(15포함x,30포함o), 30~40, 40~60, 60~99) -> (1~15, 16~30, 31~40, 41~60, 61~99)
lb = ['미성년자','청년','장년','중년','노년'] # 구간 이름 설정 (범주)
pd.cut(ages, bins = bins, labels = lb) #bins(구간설정) = 구간설정할 변수명, labels(범주) = 범주설정할 변수명
# NaN -> 구간에 포함되지 않는 값 / 0과 100도 포함하기위해 구간을 0 -> -1 , 99 -> 100으로 변경
['미성년자', '미성년자', '미성년자', '청년', '청년', ..., '노년', '청년', '중년', '장년', '노년']
Length: 12
Categories (5, object): ['미성년자' < '청년' < '장년' < '중년' < '노년']
df_cat = pd.DataFrame(ages, columns = ['ages'])
df_cat['ages_cat']=pd.cut(ages, bins = bins, labels = lb)
df_cat['ages_cat'].value_counts()
# .value_counts() : 값의 횟수를 세주는 함수
미성년자 3
청년 3
장년 3
노년 2
중년 1
Name: ages_cat, dtype: int64
# np.bincount()
import numpy as np
arr = np.array([1,1,2,3,2,2])
np.bincount(arr)
array([0, 2, 3, 1], dtype=int64) # 0 -> 0개 1 -> 2개 2 -> 3개 3 -> 1개
s_sex = pd.Series(['female','female','male','male','female'])
s_pi = pd.Series([1,2,3,4,5])
s_sur =pd.Series([1,0,1,0,1])
display(s_sex)
display(s_pi)
display(s_sur)
0 female
1 female
2 male
3 male
4 female
dtype: object
0 1
1 2
2 3
3 4
4 5
dtype: int64
0 1
1 0
2 1
3 0
4 1
dtype: int64
#병합하는 함수
# concact()
pd.concat([s_sur,s_sex,s_pi], axis=1)
titanic.columns
titanic.columns = ['Survived','Sex','PassengerId']
titanic
0 1 2
0 1 female 1
1 0 female 2
2 1 male 3
3 0 male 4
4 1 female 5
RangeIndex(start=0, stop=3, step=1)
Survived Sex PassengerId
0 1 female 1
1 0 female 2
2 1 male 3
3 0 male 4
4 1 female 5
s_sex = pd.Series(['female','female','male','male','female'])
s_sex.name = 'Sex'
s_pi = pd.Series([1,2,3,4,5])
s_pi.name = 'PassengerId'
s_sur =pd.Series([1,0,1,0,1])
s_sur.name = 'Survived'
titanic2 = pd.concat([s_sur,s_sex,s_pi], axis=1)
titanic2
Survived Sex PassengerId
0 1 female 1
1 0 female 2
2 1 male 3
3 0 male 4
4 1 female 5
# 인덱스 이름이 다를때 어떻게 병합될까?
s_sex.index
s_sex.index = range(5,10)
s_sex
# ignore_index 기존 인덱스 값을 무시하고 기존 배열의 인덱스값대로 들어가는 키워드
pd.concat([s_sur,s_sex], axis=1, ignore_index = True)
RangeIndex(start=0, stop=5, step=1) # 0부터 4까지
5 female
6 female
7 male
8 male
9 female
Name: Sex, dtype: object
Survived Sex
0 1.0 NaN
1 0.0 NaN
2 1.0 NaN
3 0.0 NaN
4 1.0 NaN
5 NaN female
6 NaN female
7 NaN male
8 NaN male
9 NaN female
titanic[['Survived','Sex']].groupby #titanic.iloc[:,:2]
titanic[['Survived','Sex']].groupby('Sex').count() #이건 남자2명 여자3명을 나타낸다
titanic[['Survived','Sex']].groupby('Sex').sum()
# 1이 생존 0이 사망이므로 sum을 이용해 더해서 생존자만 나타낼 수 있다.
Survived Sex
0 1 female
1 0 female
2 1 male
3 0 male
4 1 female
Survived
Sex
female 3
male 2
Survived
Sex
female 2
male 1
# 성별에 따른 생존자수/사망자 수 확인하기
titanic.groupby(['Sex','Survived']).count()
PassengerId
Sex Survived
female 0 1
1 2
male 0 1
1 1
a = titanic[titanic['Sex'] == 'female'] # 타이타닉의 여성 데이터
a[a['Survived'] == 1] # 생존자에 대해서 접근
Survived Sex PassengerId
0 1 female 1
1 0 female 2
4 1 female 5
Survived Sex PassengerId
0 1 female 1
4 1 female 5
- drop() : 삭제하는 함수
titanic.drop('Sex', axis=1)
titanic.drop(['Sex','PassengerId'], axis=1, inplace = True)
titanic
Survived PassengerId
0 1 1
1 0 2
2 1 3
3 0 4
4 1 5
Survived
0 1
1 0
2 1
3 0
4 1
# 행 삭제
titanic.drop(1, axis=0, inplace=True) # inplace -> 삭제한것 저장
titanic
Survived
0 1
2 1
3 0
4 1
'빅데이터 서비스 교육 > PythonLibrary' 카테고리의 다른 글
PythonLib Numpy (0) | 2022.05.04 |
---|---|
PythonLib 모듈, 데이터분석 (0) | 2022.05.04 |