DataFrame 클래스
DataFrame 객체 생성하기
Pandas의 DataFrame 클래스는 테이블 형태로 된 2차원 자료구조이다.
DataFrame은 여러 개의 열과 행으로 구성되며, 각 열은 서로 다른 데이터 형(Type)을 가질 수 있다.
DataFrame 객체를 생성하는 방법은 다양한데, 딕셔너리의 값으로 리스트를 사용하는 방법이 가장 많이 사용된다.
import pandas as pd
data = {'이름' : ['홍지수','안지영','김성수','최예린'],
'아이디' : ['jisuhong', 'jyahn', 'sukim', 'yrchoi'],
'비밀번호' : ['1234', '1234', '1234', '1234']}
frame = pd.DataFrame(data)
print(frame)
이름 아이디 비밀번호
0 홍지수 jisuhong 1234
1 안지영 jyahn 1234
2 김성수 sukim 1234
3 최예린 yrchoi 1234
- 3~5행 : 딕셔너리의 키가 '이름','아이디','비밀번호'이고, 값은 각 키에 해당되는 요소로 구성된 리스트인 딕셔너리 data를 생성한다.
- 7,8행 : 딕셔너리 data를 이용하여 DataFrame 객체 frame을 생성한다. 실행해 보면 frame 객체의 열 인덱스는 '이름', '아이디', '비밀번호' 이고, 행 인덱스는 0으로 시작하는 정수로 되어 있다.
DataFrame에 인덱스 설정하기
DataFrame 객체에서 열과 행 인덱스는 다음과 같이 설정할 수 있다.
[서식] 데이터프레임명 = pd.DataFrame(딕셔너리명, columns = 리스트, index = 리스트)
import pandas as pd
member = {'이름':['김영준','한지원'],
'나이':[20,23],
'전화번호':['010-3535-4576','010-1295-7899']}
frame = pd.DataFrame(member, columns = ['이름','전화번호','나이','주소'], index = ['01','02'])
print(frame)
이름 전화번호 나이 주소
01 김영준 010-3535-4576 20 NaN
02 한지원 010-1295-7899 23 NaN
- 7행 : 딕셔너리 member를 이용하여 DataFrame 객체 frame을 생성한다. columns = ['이름','전화번호','나이','주소']는 열 인덱스를 '이름','전화번호','나이','주소'로 설정한다. 그리고 index = ['01','02']는 행의 인덱스를 '01','02'로 설정한다.
- 8행 : DataFrame 객체 frame의 출력 결과를 보면 '주소'열은 딕셔너리 member에 존재하지 않기 때문에 NULL 값인 NaN으로 표시된다. 그리고 8행에서 설정된 행 인덱스에 의해 제목이 '01','02'으로 나타나게 된다.
DataFrame 요소 추출하기
DataFrame 객체에서 특정 요소를 추출하는 데는 loc 속성과 iloc 속성이 사용된다.
loc을 이용한 DataFrame 요소 추출
[서식] 데이터프레임명.loc[[행 인덱스명, 행 인덱스명, ...] [열 인덱스명, 열 인덱스명,...]]
데이터프레임명에 대해 행 인덱스의 Name 속성이 행, 인덱스명, 행, 인덱스명,... 이고, 열 인덱스의 Name 속성이 열, 인덱스명, 열, 인덱스명, .. 인 요소들로 구성된 DataFrame 객체를 얻는다.
# 예제
data = {'학교명' : ['가나고','다라고','마바고','사아고','자차고'],
'학급수':[25,23,15,19,10],
'학생수':[620,600,550,580,400],
'교사수':[80,95,70,90,65]}
frame = pd.DataFrame(data, index = ['01','02','03','04','05'])
- 8행 : 딕셔너리 data를 이용하여 DataFrame 객체 frame을 생성하고, 행 인덱스는 '01','02','03','04','05'로 설정한다.
print(frame)
학교명 학급수 학생수 교사수
01 가나고 25 620 80
02 다라고 23 600 95
03 마바고 15 550 70
04 사아고 19 580 90
05 자차고 10 400 65
- 실행 결과를 보면 DataFrame 객체 frame은 5행 4열의 테이블로 구성되어 있음을 알 수 있다.
print(frame.loc['02','학생수'])
600
- frame.loc['02','학생수']은 frame 객체에서 행 인덱스가 '02'이고 열의 인덱스가 '학생수'인 요소의 값, 즉 600이 된다. 이와 같이 loc 속성을 이용하면 행 인덱스와 열 인덱스를 이용하여 객체의 요소에 접근할 수 있다.
print(frame.loc['04',['학교명','학급수','교사수']])
학교명 사아고
학급수 19
교사수 90
Name: 04, dtype: object
- frame.loc['04',['학교명','학급수','교사수']]은 frame 객체에서 행 인덱스가 '04'이고 열 인덱스가 '학교명','학급수','교사수'인 DataFrame 객체를 반환한다. 따라서 사아고(04 인덱스)의 학교명, 학급수, 교사수를 화면에 출력한다.
실행 결과의 마지막 줄에 나타난 Name: 04는 행 인덱스명이 '04'임을 나타내고, dtype: object는 데이터 형(Type)이 object, 즉 객체라는 것을 의미한다.
iloc을 이용한 DataFrame 요소 추출
[서식] 데이터프레임명.iloc[행..인덱스번호, 열..인덱스번호]
loc에서 Name 속성의 인덱스명을 사용하는 것과 달리 iloc에서는 0으로 시작하는 정수를 인덱스로 사용한다. 행..인데스번호와 열 인덱스번호는 [0], [1:3], [:3], [5:],[:] 등에서와 같이 문자열과 리스트에서 사용하는 인덱스 방식과 거의 유사하다.
data = {'아이디':['kim','song','han','choi'],
'구매상품':[15000,23000,33000,50000],
'개수':[3,5,1,10],
'구매일':['0303','0810','0120','0601']}
frame = pd.DataFrame(data)
print(frame)
아이디 구매상품 개수 구매일
0 kim 15000 3 0303
1 song 23000 5 0810
2 han 33000 1 0120
3 choi 50000 10 0601
- 딕셔너리 data를 생성하고, DataFrame 객체 frame을 생성한다. frame 객체는 5행 3열로 구성되어있다. 행 인덱스는 0부터 시작하는 정수이고, 열 인덱스느 '아이디', '구매상품', '가격', '개수', '구매일'로 구성된다.
print(frame.iloc[2,0])
han
- 행 인덱스가 2이고, 열 인덱스가 0인 요소의 값인 'han'의 값을 가진다.
print(frame.iloc[3,:2])
아이디 choi
구매상품 50000
Name: 3, dtype: object
- 행 인덱스가 3이고 열 인덱스는 0과 1인 열 ('아이디','구매상품')에 해당되는 구성된 다음의 객체를 의미한다.
print(frame.iloc[:,[0,3]])
아이디 구매일
0 kim 0303
1 song 0810
2 han 0120
3 choi 0601
- frame 객체에서 행 인덱스 (:), 즉 행 전체에 대해 열 인덱스가 0('아이디')과 3('구매일')인 요소들로 구성된 다음의 객체를 나타낸다.
sum() 메소드로 합계 구하기
[서식] 데이터프레임명.sum(axis = 0 또는 axis =1)
axis : 열방향(axis = 0) 또는 행방향(axis=1)으로 배열 요소를 DataFrame(또는 Series) 객체로 반환한다.
- sum() 메소드를 이용한 5명 학생의 세 과목 성적 합계 프로그램
scores = {'이름' : ['김지영','안지수','최성수','황예린','김소정'],
'국어' : [95,97,90,84,87],
'영어' : [90,86,93,85,93],
'수학' : [85,88,89,88,99]}
frame = pd.DataFrame(scores)
print(frame)
이름 국어 영어 수학
0 김지영 95 90 85
1 안지수 97 86 88
2 최성수 90 93 89
3 황예린 84 85 88
4 김소정 87 93 99
- 딕셔너리 scores를 생성하고 이용하여 DataFrame 객체 frame을 생성한 다음 화면에 출력한다.
frame2 = frame.iloc[:,[1,2,3]]
frame2
국어 | 영어 | 수학 | |
---|---|---|---|
0 | 95 | 90 | 85 |
1 | 97 | 86 | 88 |
2 | 90 | 93 | 89 |
3 | 84 | 85 | 88 |
4 | 87 | 93 | 99 |
- 모든 행(:)에 대해 열 인덱스 1,2,3인 열의 데이터를 의미한다. 실행 결과를 보면 frame2 객체는 열 인덱스 0인 '이름' 열을 제외한 데이터로 구성되어 있음을 알 수 있다.
total = frame2.sum(axis = 1)
total
0 270
1 271
2 272
3 257
4 279
dtype: int64
- frame2.sum(axis = 1)은 행 방향으로 요소 값의 합계를 구한다. 실행 결과에 나타난 total 객체는 5명 학생에 대한 세 과목 성적의 합계를 의미한다.
mean() 메소드로 성적 평균 구하기
[서식] 데이터프레임명.mean(axis = 0 또는 axis =1)
axis : 열방향(axis = 0) 또는 행방향(axis=1)으로 배열 요소를 DataFrame(또는 Series) 객체로 반환한다.
scores = {'이름' : ['김지영','안지수','최성수','황예린','김소정'],
'국어' : [95,97,90,84,87],
'영어' : [90,86,93,85,93],
'수학' : [85,88,89,88,99]}
frame = pd.DataFrame(scores)
frame
이름 | 국어 | 영어 | 수학 | |
---|---|---|---|---|
0 | 김지영 | 95 | 90 | 85 |
1 | 안지수 | 97 | 86 | 88 |
2 | 최성수 | 90 | 93 | 89 |
3 | 황예린 | 84 | 85 | 88 |
4 | 김소정 | 87 | 93 | 99 |
frame2 = frame.iloc[:,[1,2,3]]
frame2
국어 | 영어 | 수학 | |
---|---|---|---|
0 | 95 | 90 | 85 |
1 | 97 | 86 | 88 |
2 | 90 | 93 | 89 |
3 | 84 | 85 | 88 |
4 | 87 | 93 | 99 |
total = frame2.sum(axis = 1)
total
0 270
1 271
2 272
3 257
4 279
dtype: int64
avg = frame2.mean(axis = 1)
avg
0 90.000000
1 90.333333
2 90.666667
3 85.666667
4 93.000000
dtype: float64
- mean() 메소드를 이용하여 frame2 객체에 저장된 성적의 평균을 구해 avg 객체에 저장한다.
print('-' * 50)
print('이름 합계 평균')
print('-' * 50)
for i in range(5):
print('%s %d %.2f' %(frame.iloc[i,0], total.iloc[i], avg.iloc[i]))
print('-' * 50)
--------------------------------------------------
이름 합계 평균
--------------------------------------------------
김지영 270 90.00
안지수 271 90.33
최성수 272 90.67
황예린 257 85.67
김소정 279 93.00
--------------------------------------------------
- 실행 결과에서와 같이 5명 학생의 성적 합계와 평균을 출력한다.
'파이썬 > Pandas' 카테고리의 다른 글
판다스 pandas - 통계함수 (평균,최대,최소,중간,표준편차,상관계수) (0) | 2022.11.11 |
---|---|
판다스 Pandas 데이터프레임 구조 - 미리보기, 살펴보기 (0) | 2022.11.10 |
판다스 Pandas - 데이터 입출력하기(csv, excel) (0) | 2022.11.10 |
판다스 자료구조 정리 - 시리즈 / 데이터프레임 생성 및 수정 (0) | 2022.11.04 |
파이썬 Pandas - Series 객체 생성 및 수정 (0) | 2022.11.01 |
댓글