DataFrame 데이터 계산
페이지정보
내용
DataFrame 데이터 계산
pandas에서는 다양한 계산값을 제공한다. 몇 가지 예를 살펴보고 더 많은 메서드는 아래의 주소에서 참고한다.
https://pandas.pydata.org/pandas-docs/stable/reference/frame.html
기본 코드
import pandas as pd
data = pd.read_excel('datasample.xlsx') # 번호 값 제외 numbers = data.pop('번호') |
1. DataFrame.max()
최대값 반환
axis = 0 : 각 columns 값중에서 최대값 (default)
axis = 1 : 각 rows 의 값 중에서 최대값
result = data.max() print(result) |
결과
국어 95 영어 95 수학 98 과학 95 dtype: int64 |
result = data.max(axis = 1) print(result) |
결과
0 70 1 98 2 80 3 95 4 95 5 95 6 95 7 92 8 94 9 95 10 95 11 89 12 95 13 92 14 95 15 94 dtype: int6 |
2. DataFrame.min()
최소값 반환
axis = 0 : 각 columns 중에서 최소값 (default)
axis = 1 : 각 rows 중에서 최소값
result = data.min() print(result) |
결과
국어 21 영어 51 수학 34 과학 45 dtype: int64 |
result = data.min(axis = 1) print(result) |
결과
국어 21 영어 51 수학 34 과학 45 dtype: int64 |
3. DataFrame.sum()
합계 반환
axis = 0 : 각 columns 합계 (default)
axis = 1 : 각 rows 합계
result = data.sum() print(result) |
결과
국어 989 영어 1200 수학 1206 과학 1211 dtype: int64 |
result = data.sum(axis = 1) print(result) |
결과
0 236 1 353 2 267 3 309 4 350 5 277 6 279 7 303 8 268 9 264 10 294 11 330 12 297 13 280 14 273 15 226 dtype: int64 |
4. DataFrame.mean()
평균값 반환
axis = 0 : 각 columns 평균값 (default)
axis = 1 : 각 rows 평균값
result = data.mean() print(result) |
결과
국어 61.8125 영어 75.0000 수학 75.3750 과학 75.6875 dtype: float64 |
result = data.mean(axis = 1) print(result) |
결과
0 59.00 1 88.25 2 66.75 3 77.25 4 87.50 5 69.25 6 69.75 7 75.75 8 67.00 9 66.00 10 73.50 11 82.50 12 74.25 13 70.00 14 68.25 15 56.50 dtype: float64 |
5. DataFrame.median()
중앙값 반환
axis = 0 : 각 columns 중앙값 (default)
axis = 1 : 각 rows 중앙값
- 중앙값(median) 또는 중위수는 어떤 주어진 값들을 크기의 순서대로 정렬했을 때 가장 중앙에 위치하는 값을 의미한다. 예를 들어 1, 2, 100의 세 값이 있을 때, 2가 가장 중앙에 있기 때문에 2가 중앙값이다.
값이 짝수개일 때에는 중앙값이 유일하지 않고 두 개가 될 수도 있다. 이 경우 그 두 값의 평균을 취한다. 예를 들어 1, 10, 90, 200 네 수의 중앙값은 10과 90의 평균인 50이 된다.
출처 : https://ko.wikipedia.org/wiki/%EC%A4%91%EC%95%99%EA%B0%92
result = data.median() print(result) |
결과
국어 64.5 영어 71.5 수학 76.5 과학 78.5 dtype: float64 |
result = data.median(axis = 1) print(result) |
결과
0 60.5 1 95.0 2 66.5 3 73.0 4 90.0 5 68.5 6 74.5 7 73.0 8 70.0 9 59.5 10 67.5 11 81.5 12 78.5 13 64.5 14 73.0 15 55.5 dtype: float64 |
6. DataFrame.rank()
순위 반환
DataFrame.rank(self: ~FrameOrSeries, axis=0, method: str = 'average', numeric_only: Union[bool, NoneType] = None, na_option: str = 'keep', ascending: bool = True, pct: bool = False)
axis = 0 : 각 columns 내의 순위 (default)
axis = 1 : 각 rows 내의 순위
method - 값이 같은 records 그룹 순위 정하는 방법
method = average : 그룹의 평균 순위 (default)
method = min : 그룹중에 가장 낮은 수
method = max : 그룹중에 가장 높은 수
method = first : 배열에 나오는 순서
method = dense : min과 같으나 동점 그룹은 1로 증가 (1, 2, 3, 3, 3, 4....)
numeric_only = True : 숫자만 순위 매김 (default)
numeric_only = False
na_option = keep : NaN 값을 NaN으로 유지 (default)
na_option = top : 오름차순일 경우 가장 작은 수 (1등)
na_option = bottom : 오름차순일 경우 가장 높은 수 (꼴찌)
ascending = True : 오름차순 (작은 값에서 큰 값으로) (default)
ascending = True : 내림차순 (큰 값에서 작은 값으로)
pct = False : 순위로 표시 (default)
pct = True : 순위를 백분위 수 형식으로 표시
result = data.rank(axis = 0, method='min', ascending=True, numeric_only=True, na_option='top') print(result) |
결과
국어 영어 수학 과학 0 12.0 2.0 5.0 1.0 1 9.0 15.0 16.0 13.0 2 14.0 3.0 3.0 5.0 3 11.0 15.0 6.0 8.0 4 16.0 12.0 8.0 13.0 5 7.0 9.0 12.0 1.0 6 3.0 3.0 10.0 13.0 7 13.0 8.0 11.0 4.0 8 5.0 14.0 1.0 10.0 9 4.0 1.0 6.0 13.0 10 8.0 7.0 12.0 5.0 11 15.0 11.0 9.0 9.0 12 9.0 13.0 12.0 1.0 13 6.0 3.0 4.0 11.0 14 2.0 10.0 12.0 5.0 15 1.0 3.0 2.0 12.0 |
7. DataFrame.cumsum()
누적 합계 반환
axis = 0 : 각 columns 누적 합계 (default)
axis = 1 : 각 rows 누적 합계
* 점수를 다루는 통계에서는 적합하지는 않다.
result = data.cumsum() print(result) |
결과
국어 영어 수학 과학 0 70 56 65 45 1 135 151 163 140 2 215 216 217 208 3 283 311 285 286 4 378 396 360 381 5 440 471 455 426 6 475 536 539 521 7 553 604 631 586 8 609 698 665 670 9 659 749 733 765 10 723 816 828 833 11 812 900 906 912 12 877 992 1001 957 13 936 1057 1065 1049 14 968 1135 1160 1117 15 989 1200 1206 1211 |
result = data.cumsum(axis = 1) print(result) |
결과
국어 영어 수학 과학 0 70 126 191 236 1 65 160 258 353 2 80 145 199 267 3 68 163 231 309 4 95 180 255 350 5 62 137 232 277 6 35 100 184 279 7 78 146 238 303 8 56 150 184 268 9 50 101 169 264 10 64 131 226 294 11 89 173 251 330 12 65 157 252 297 13 59 124 188 280 14 32 110 205 273 15 21 86 132 226 |
##########
문제 1)
- 각 번호별 합계와 평균을 구하여 column에 추가한다.
- 과목별 평균을 구하여 가장 아래 row에 추가한다.
- 각 번호별 평균이 80점 이상이면 A, 70점 이상이면 B 그 외 점수는 C를 부여하여 'Grade'라는 이름으로 column에 추가한다.
- 평균을 기준으로 내림차순으로 순위를 정한다. (높은 점수가 1등이 된다.)
위의 문제를 해결하여 결과가 아래와 같도록 만들어 본다.
번호 국어 영어 수학 과학 합계 평균 Grade Rank 0 1번 70.0000 56.0 65.000 45.0000 236 59 C 15 1 2번 65.0000 95.0 98.000 95.0000 353 88.25 A 1 2 3번 80.0000 65.0 54.000 68.0000 267 66.75 C 13 3 4번 68.0000 95.0 68.000 78.0000 309 77.25 B 4 4 5번 95.0000 85.0 75.000 95.0000 350 87.5 A 2 5 6번 62.0000 75.0 95.000 45.0000 277 69.25 C 10 6 7번 35.0000 65.0 84.000 95.0000 279 69.75 C 9 7 8번 78.0000 68.0 92.000 65.0000 303 75.75 B 5 8 9번 56.0000 94.0 34.000 84.0000 268 67 C 12 9 10번 50.0000 51.0 68.000 95.0000 264 66 C 14 10 11번 64.0000 67.0 95.000 68.0000 294 73.5 B 7 11 12번 89.0000 84.0 78.000 79.0000 330 82.5 A 3 12 13번 65.0000 92.0 95.000 45.0000 297 74.25 B 6 13 14번 59.0000 65.0 64.000 92.0000 280 70 C 8 14 15번 32.0000 78.0 95.000 68.0000 273 68.25 C 11 15 16번 21.0000 65.0 46.000 94.0000 226 56.5 C 16 16 평균 61.8125 75.0 75.375 75.6875 |
문제 2)
- Rank를 기준으로 오름차순으로 정렬해 본다. (Rank가 1위부터 16위까지 순서대로 나열)
문제 3)
- 1번의 결과를 QTableWidget을 이용하여 보여주는 GUI 프로그램으로 만들어 본다.
1)번 코드 - 이 코드는 여러 방법중 하나일 뿐, 자신만의 다양한 코드로 결과를 만들 수 있다.
print()는 중간중간 결과를 확인하는 용도이다.
import pandas as pd data = pd.read_excel('datasample.xlsx')
# 1. 각 번호의 합계와 평균을 구한다.
# 2. 과목별 평균을 구한다.
# 3. 합계와 평균을 칼럼에 추가한다.
# 4. 등급을 정하는 함수를 만든다.
# 5. 등급을 칼럼에 추가한다.
# 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
# 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다.
# 8. NaN 값을 모두 공백으로 처리해준다.
# 9. 데이터의 rows 길이를 구한다. # 첫번째 칼럼의 마지막 행 값을 "평균"으로 수정한다고 할 때, 16:17 이라는 index를 숫자로 직접 넣어도 되지만, # 항상 데이터의 rows, columns 길이는 직접 계산하여 사용하도록 한다. # 그렇게 해야 데이터파일이 변경되어도 소스 코드를 수정하지 않고 적용할 수 있다.
# 10. 번호에 해당하는 마지막 row의 이름을 '평균'으로 수정한다.
# 11. 최종 결과를 확인한다. |
2)번을 실행시키기 위해서는 1)번 코드에서 6번과 7번 사이에 아래의 코드를 추가하면 된다.
'''''' # 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
data = data.sort_values(by='Rank', ascending=True)
# 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다. '''''' |
3)번 코드
아래와 같이 UI 파일을 만든다. UI파일의 배치는 자유, 다만 QTableWidget은 필수이다.
UI FileName : PandasDataFraemTest.ui
Widget ObjectName
QLineEdit : Filepath
QPushButton : BTN_fileload
QTableWidget : TW_pandas
코드
import sys
def setupUI(self):
# ui 파일 로딩
# 버튼과 이벤트 연결
self.setCentralWidget(UI_set)
def FileOpen(self):
# 1. 각 번호의 합계와 평균을 구한다.
# 2. 과목별 평균을 구한다.
# 3. 합계와 평균을 칼럼에 추가한다.
# 4. 등급을 정하는 함수를 만든다.
# 5. 등급을 칼럼에 추가한다.
# 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
# Rank 오름차순
# 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다.
# 8. NaN 값을 모두 공백으로 처리해준다.
# 9. 데이터의 rows 길이를 구한다.
# 10. 번호에 해당하는 마지막 row의 이름을 '평균'으로 수정한다.
# 계산된 DataFrame을 QTableWidget에 넣기 viewTable(data)
def viewTable(data):
# data의 전체 values
# TableWidget의 column 갯수 생성 및 헤더 이름 넣기 # TableWidget의 rows길이 정하기
# rows 만큼 loop
|
결과
File Load 버튼 눌러서 파일 선택