빅데이터 서비스 교육/PythonLibrary

PythonLib Pandas

Manly 2022. 5. 4. 15:50
반응형
	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 연산

df
	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