DataFrame 데이터 계산 > Data Analysis and Machine Learning

본문 바로가기

사이트 내 전체검색

이전으로Data Analysis and Machine Learning

DataFrame 데이터 계산

페이지정보

글쓴이 관리자 조회 19,600 조회 날짜 20-03-06 17:49 / U:20-11-03 09:46
댓글 0댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

내용

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. 각 번호의 합계와 평균을 구한다.
data_sum = data.sum(axis = 1)
print(data_sum)
data_mean = data.mean(axis = 1)
print(data_mean)

 

# 2. 과목별 평균을 구한다.
data_sub_mean = data.mean(axis = 0)
print(data_sub_mean)

 

# 3. 합계와 평균을 칼럼에 추가한다.
data['합계'] = data_sum
data['평균'] = data_mean
print(data)

 

# 4. 등급을 정하는 함수를 만든다.
def grade(row):
    if row['평균'] > 80:
        return 'A'
    elif row['평균'] > 70:
        return 'B'
    else:
        return 'C'

 

# 5. 등급을 칼럼에 추가한다.
data['Grade'] = data.apply(grade, axis=1)
print(data)

 

# 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
data['Rank'] = data['평균'].rank(axis=0, method="min", ascending=False)
print(data)

 

# 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다.
data = data.append(data_sub_mean, ignore_index=True)
print(data)

 

# 8. NaN 값을 모두 공백으로 처리해준다.
data = data.fillna("")
print(data)

 

# 9. 데이터의 rows 길이를 구한다.

# 첫번째 칼럼의 마지막 행 값을 "평균"으로 수정한다고 할 때, 16:17 이라는 index를 숫자로 직접 넣어도 되지만,

# 항상 데이터의 rows, columns 길이는 직접 계산하여 사용하도록 한다.

# 그렇게 해야 데이터파일이 변경되어도 소스 코드를 수정하지 않고 적용할 수 있다.
rows_count = len(data.values)
print(rows_count)

 

# 10. 번호에 해당하는 마지막 row의 이름을 '평균'으로 수정한다.
data.iat[rows_count - 1, 0] = '평균'

 

# 11. 최종 결과를 확인한다.
print(data)

 

 

2)번을 실행시키기 위해서는 1)번 코드에서 6번과 7번 사이에 아래의 코드를 추가하면 된다.

 

''''''

# 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
data['Rank'] = data['평균'].rank(axis=0, method="min", ascending=False)
print(data)

 

data = data.sort_values(by='Rank', ascending=True)
print(data)

 

# 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다.
data = data.append(data_sub_mean, ignore_index=True)
print(data)

''''''

 

 

3)번 코드

 

아래와 같이 UI 파일을 만든다. UI파일의 배치는 자유, 다만 QTableWidget은 필수이다.

2921044682_1583729721.011.png

 

2921044682_1583729730.9849.png

 

UI FileName : PandasDataFraemTest.ui

 

Widget ObjectName

QLineEdit : Filepath

QPushButton : BTN_fileload

QTableWidget : TW_pandas

 

코드

import sys
import os
import pandas as pd
from PySide2 import QtUiTools
from PySide2.QtWidgets import QApplication, QMainWindow
from PySide2.QtWidgets import QTableWidgetItem, QFileDialog


# 메인 클래스 시작
class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

 

    def setupUI(self):
        global UI_set

 

        # ui 파일 로딩
        UI_set = QtUiTools.QUiLoader().load(resource_path("PandasDataFrameTest.ui"))

 

        # 버튼과 이벤트 연결
        UI_set.BTN_fileload.clicked.connect(self.FileOpen)

 

        self.setCentralWidget(UI_set)
        self.setWindowTitle("Data Analysis Table")
        self.resize(700, 550)
        self.show()

 

    def FileOpen(self):
        # 파일 다이얼로그로 부터 선택된 파일 경로 받아오기
        dialog = QFileDialog(self)
        dialog.setFileMode(QFileDialog.ExistingFile)
        dialog.setNameFilter(
            self.tr("Data Files (*.csv *.xls *.xlsx);; All Files(*.*)"))
        dialog.setViewMode(QFileDialog.Detail)
        if dialog.exec_():
            fileName = dialog.selectedFiles()
            # 받아온 Excel 파일 경로를 LineEdit에 표시
            UI_set.Filepath.setText(fileName[0])
            # 받아온 파일 경로를 loadData 함수로 넘김
            loadData(fileName[0])


def loadData(filename):
    # 파일 경로의 Excel 파일을 읽어서 pandas DataFrame으로 만들기
    data = pd.read_excel(filename)

 

    # 1. 각 번호의 합계와 평균을 구한다.
    data_sum = data.sum(axis=1)
    data_mean = data.mean(axis=1)

 

    # 2. 과목별 평균을 구한다.
    data_sub_mean = data.mean(axis=0)

 

    # 3. 합계와 평균을 칼럼에 추가한다.
    data['합계'] = data_sum
    data['평균'] = data_mean

 

    # 4. 등급을 정하는 함수를 만든다.
    def grade(row):
        if row['평균'] > 80:
            return 'A'
        elif row['평균'] > 70:
            return 'B'
        else:
            return 'C'

 

    # 5. 등급을 칼럼에 추가한다.
    data['Grade'] = data.apply(grade, axis=1)

 

    # 6. 평균을 기준으로 랭크를 정하여 'Rank' 칼럼에 추가한다.
    data['Rank'] = data['평균'].rank(axis=0, method="min", ascending=False)

 

    # Rank 오름차순
    # data = data.sort_values(by='Rank', ascending=True)

 

    # 7. 2번에서 만들어 놓은 과목별 평균을 제일 밑에 추가한다.
    data = data.append(data_sub_mean, ignore_index=True)

 

    # 8. NaN 값을 모두 공백으로 처리해준다.
    data = data.fillna("")

 

    # 9. 데이터의 rows 길이를 구한다.
    rows_count = len(data.values)

 

    # 10. 번호에 해당하는 마지막 row의 이름을 '평균'으로 수정한다.
    data.iat[rows_count - 1, 0] = '평균'

    

    # 계산된 DataFrame을 QTableWidget에 넣기

    viewTable(data)

 

def viewTable(data):
    # data의 columns
    columns = data.columns
    # columns를 list로 만들기
    columnlist = list(columns)
    # columns의 길이
    columncount = len(columnlist)

 

    # data의 전체 values
    rows = data.values
    # values의 전체 길이
    rowcount = len(rows)

 

    # TableWidget의 column 갯수 생성 및 헤더 이름 넣기
    UI_set.TW_pandas.setColumnCount(columncount)
    UI_set.TW_pandas.setHorizontalHeaderLabels(columnlist)

    # TableWidget의 rows길이 정하기
    UI_set.TW_pandas.setRowCount(rowcount)

 

    # rows 만큼 loop
    for r in range(rowcount):
        # columns 만큼 loop 돌면서 Table의 각 셀에 값 넣기
        for c in range(columncount):
            UI_set.TW_pandas.setItem(r, c, QTableWidgetItem(str(rows[r][c])))


# 파일 경로
def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    sys.exit(app.exec_())

 

결과

2921044682_1583731531.7525.png

 

File Load 버튼 눌러서 파일 선택

2921044682_1583731540.9385.png

 

2921044682_1583731554.0192.png

 

댓글목록

댓글이 없습니다

게시물 검색
총 7 건 , 1 페이지
올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구
Copyright © JBMPA.com All rights reserved.
사이트 언어 선택
PC 보기