Python Pandas 마스터하기 71~80

이번 포스팅은 Python pandas 마스터하기 위한 여덟 번째 포스팅입니다( python pandas 마스터하기 71~80 ).

이번 포스팅 내용을 학습하기 전에 이전 포스팅(Python pandas 마스터하기 1 ~10, Python pandas 마스터하기 11 ~20, Python pandas 마스터하기 21 ~30, Python pandas 마스터하기 31 ~40, Python pandas 마스터하기 41 ~50, Python pandas 마스터하기 51 ~60, Python pandas 마스터하기 61 ~70) 내용을 먼저 학습하시기 바랍니다.

간단한 예제 코드와 설명을 포함한 100가지 Python pandas 코드 중 No 71 ~ 80개에 대해서 살펴보겠습니다.

71. 데이터프레임의 연속 행 간의 차이 계산

import pandas as pd
from itertools import combinations

tempdata = {'이름': ['철수', '영희', '영남'],
            '나이': [45, 30, 55],
            '점수': [598, 487, 254],
            '고향': ['서울', '부산', '인천'],
            '생년월일': ['19860511', '19990622', '20200823'],
           }

# 인덱스가 'one','two','three'인 finalData 데이터프레임 생성하기 
finalData = pd.DataFrame(tempdata, index = ['one','two','three'])

# 연속된 행 간의 차이 계산
rowDiff = finalData[['나이']].diff()
rowDiff
----------------------------------------
나이
one	    NaN
two	   -15.0
three	25.0

Pandas의 diff() 함수는 데이터프레임의 연속 행 간의 차이를 계산합니다. 기본적으로 차이는 수직(즉, 행 간)으로 계산합니다. 만약, 수평(즉, 열 간)으로 차이를 계산하려면 axis 매개변수를 지정해야 합니다.


72. 데이터프레임의 여러 열에서 데이터를 집계하여 새 데이터프레임 생성하기

import pandas as pd

columnsToAggregate = ['나이', '점수']

# 데이터를 집계하여 새로운 데이터프레임 생성하기 
newDf = pd.DataFrame({
    'sum': finalData[columnsToAggregate].sum(axis=1),   # 열의 합 계산
    'mean': finalData[columnsToAggregate].mean(axis=1), # 열의 평균 계산
    'max': finalData[columnsToAggregate].max(axis=1),   # 열의 최대값 계산
    'min': finalData[columnsToAggregate].min(axis=1)    # 열의 최소값 계산
})

newDf
-------------------------------------------------------------------------------
        sum	 mean	max	min
one	    643	 321.5	598	45
two	    517	 258.5	487	30
three	309	 154.5	254	55

위 코드는 ‘sum’, ‘mean’, ‘max’ 및 ‘min’이라는 4개의 열을 포함하는 새로운 데이터프레임인 newDf를 생성하는 코드입니다. 이러한 열은 finalData에서 지정된 열 기준의 집계된 값을 나타냅니다. 위 코드로 수행되는 집계 작업은 열의 합계, 평균, 최대값, 최소값입니다.


73. 데이터프레임 열의 값 순위 계산

import pandas as pd

columnToRank = '점수'

# 열에 있는 값의 순위 계산
finalData['rank'] = finalData[columnToRank].rank(method = 'average', ascending = True)
finalData
----------------------------------------------------------------------------------------
	    이름	나이	점수	고향	생년월일	    rank
one	    철수	45	    598	    서울	19860511	3.0
two	    영희	30	    487	    부산	19990622	2.0
three	영남	55	    254	    인천	20200823	1.0

위 코드는 Pandas의 Rank() 함수를 사용하여 순위를 계산하는 코드입니다. 데이터프레임의 새 열 ‘rank’에 순위 값을 저장합니다. Rank() 함수의 method 매개 변수는 동률 값에 순위를 할당할 때 사용할 방법을 지정합니다.

여기서는 동률인 값에 평균 순위를 부여하는 ‘average’을 사용합니다. 특정 요구 사항에 따라 ‘min’, ‘max’ 또는 ‘dense’와 같은 다른 방법을 선택할 수 있습니다.


74. 데이터프레임의 열 하위 집합을 기반으로 중복 행 삭제

import pandas as pd

columnsToCheck = ['이름', '점수', '나이']

# Drop duplicate rows based on the subset of columns
finalData.drop_duplicates(subset = columnsToCheck, keep ='first', inplace = True)
finalData
---------------------------------------------------------------------------------
        이름	나이	점수	고향	생년월일	    rank
one	    철수	45	    598	    서울	19860511	3.0
two	    영희	30	    487	    부산	19990622	2.0
three	영남	55	    254	    인천	20200823	1.0

위 코드는 Pandas의 drop_duplicates() 함수를 사용하여 중복 행을 삭제하는 코드입니다. drop_duplicates() 함수의 subset 매개변수는 중복 식별을 위해 고려할 열의 하위 집합을 지정합니다. keep 매개변수는 유지할 중복 값을 결정합니다. 여기서 ‘first’는 각 중복 행의 첫 번째 값을 유지하고 후속 중복 행을 삭제하는 데 사용됩니다.


75. 두 데이터프레임 간의 외적(cross-product) 계산

import pandas as pd

tempdata = {'이름': ['철수', '영희', '영남'],
            '나이': [45, 30, 55],
            '고향': ['서울', '부산', '인천'],
            '생년월일': ['19860511', '19990622', '20200823'],
            '학년': [1, 1, 2]
           }

# 인덱스가 'one','two','three'인 finalData 데이터프레임 생성하기 
finalData = pd.DataFrame(tempdata, index = ['one','two','three'])

tempdata1 = {'이름': ['영수', '진혁', '광현'],
            '나이': [64, 22, 14],
            '고향': ['대구', '울산', '전북'],
            '생년월일': ['19660413', '20000621', '20220805'],
            '학년': [3, 3, 1]
           }

# 인덱스가 'one','two','three'인 finalData1 데이터프레임 생성하기 
finalData1 = pd.DataFrame(tempdata1, index = ['one','two','three'])

# merge를 사용하여 외적(cross-product) 수행
crossProduct = pd.merge(finalData.assign(key=1), finalData1.assign(key=1), on = 'key').drop('key', axis=1)
crossProduct
------------------------------------------------------------------------------------------------------------
    이름_x	나이_x	고향_x	생년월일_x	학년_x	이름_y	나이_y	고향_y	생년월일_y	학년_y
0	철수	45	    서울	19860511	1	    영수	64	    대구	19660413	3
1	철수	45	    서울	19860511	1	    진혁	22	    울산	20000621	3
2	철수	45	    서울	19860511	1	    광현	14	    전북	20220805	1
3	영희	30	    부산	19990622	1	    영수	64	    대구	19660413	3
4	영희	30	    부산	19990622	1	    진혁	22	    울산	20000621	3
5	영희	30	    부산	19990622	1	    광현	14	    전북	20220805	1
6	영남	55	    인천	20200823	2	    영수	64	    대구	19660413	3
7	영남	55	    인천	20200823	2	    진혁	22	    울산	20000621	3
8	영남	55	    인천	20200823	2	    광현	14	    전북	20220805	1

merge() 함수는 공통 key 열을 기반으로 두 개의 데이터프레임을 결합하는 함수입니다. 외적을 계산하기 위해 새 열 ‘key’를 각 데이터프레임에 추가하고, 상수 값(이 경우 1)을 할당합니다. 그런 다음 merge() 함수를 사용하여 이 공통 key 열을 기반으로 데이터프레임을 병합합니다.

이로 인해 finalData의 모든 행이 finalData1의 모든 행과 결합하는 외적과 유사한 동작이 발생합니다. 외적을 수행한 후 drop() 함수를 사용하여 결과 데이터프레임에서 ‘key’ 열을 삭제합니다.


76. 데이터프레임에 있는 열의 누적 백분율

import pandas as pd

columnToCalculate = '나이'

finalData['나이누적백분율'] = finalData[columnToCalculate].cumsum() / finalData[columnToCalculate].sum() * 100
finalData
---------------------------------------------------------------------------------------------------------------
	    이름	나이	고향	생년월일	    학년	나이누적백분율
one	    철수	45	    서울	19860511	1	    34.615385
two	    영희	30	    부산	19990622	1	    57.692308
three	영남	55	    인천	20200823	2	    100.000000

위 코드는 열 값의 누적 합계를 계산하는 Pandas의 cumsum() 함수를 사용하여 누적 백분율을 계산하는 코드입니다.
누적 합계를 전체 열의 합계로 나누고 100을 곱하여 백분율을 구합니다.


77. 데이터프레임을 Excel 파일로 변환

데이터프레임을 Excel 파일로 변환하려면 Pandas 라이브러리에서 제공하는 to_excel() 함수를 사용할 수 있습니다.

import pandas as pd

file_path = 'D:/output.xlsx'

# 데이터프레임을 엑셀 파일로 변환
finalData.to_excel(file_path, index = False)

print(f"데이터 프레임을 성공적으로 변환하여 {file_path} 에 저장하였습니다.")
--------------------------------------------------------------------------
데이터 프레임을 성공적으로 변환하여 D:/output.xlsx 에 저장하였습니다.

위 코드는 file_path 변수를 사용하여 Excel 파일이 저장될 파일 경로와 파일명을 지정하는 코드입니다.
참고로, 파일 경로에 파일 확장자 .xlsx를 포함해야 합니다.

to_excel() 함수는 데이터프레임에서 호출되어 파일 경로를 첫 번째 인수로 전달합니다. index 매개변수를 False로 설정하여 출력 Excel 파일에서 행 인덱스를 제외할 수 있습니다.


78. 데이터프레임에 있는 열의 가중치 합계 계산

import pandas as pd


# 각 열에 적용할 가중치 정의
weights = [0.5, 0.3, 0.2]

# 가중치를 반영한 합계 계산
weightedSum = (finalData['나이'] * weights[0]) + (finalData['나이'] * weights[1]) + (finalData['나이'] * weights[2])

print("Weighted Sum:")
print(weightedSum)
---------------------------------------------------------------------------------------------------------------------
Weighted Sum:
one      45.0
two      30.0
three    55.0
Name: 나이, dtype: float64

(column1 * 가중치1) + (column2 * 가중치2) + (column3 * 가중치3) 공식을 사용하여 가중 합계를 계산합니다.
이는 finalData[‘나이’]를 사용하여 데이터프레임의 열에 접근하고 해당 열에 해당 가중치를 곱하여 최종 결과값을 반환합니다.


79. 데이터프레임을 JSON 문자열로 변환

import pandas as pd

# 데이터프레임을 JSON 문자열로 변환
jsonString = finalData.to_json()
jsonString
---------------------------------------
'{"\\uc774\\ub984":{"one":"\\ucca0\\uc218","two":"\\uc601\\ud76c","three":"\\uc601\\ub0a8"},"\\ub098\\uc774":{"one":45,"two":30,"three":55},"\\uace0\\ud5a5":{"one":"\\uc11c\\uc6b8","two":"\\ubd80\\uc0b0","three":"\\uc778\\ucc9c"},"\\uc0dd\\ub144\\uc6d4\\uc77c":{"one":"19860511","two":"19990622","three":"20200823"},"\\ud559\\ub144":{"one":1,"two":1,"three":2},"\\ub098\\uc774\\ub204\\uc801\\ubc31\\ubd84\\uc728":{"one":34.6153846154,"two":57.6923076923,"three":100.0}}'

데이터프레임을 to_json() 메서드를 사용하여 JSON 문자열로 변환할 수 있습니다.
결과 JSON 문자열은 jsonString 변수에 저장됩니다.


80. 데이터프레임 열을 범주형 데이터 유형으로 변환

import pandas as pd

# 열을 범주형 자료 형태로 변환
finalData['나이'] = finalData['나이'].astype('category')
finalData
------------------------------------------------------------

        이름	나이	고향	생년월일	    학년	나이누적백분율
one	    철수	45	    서울	19860511	1	    34.615385
two	    영희	30	    부산	19990622	1	    57.692308
three	영남	55	    인천	20200823	2	    100.000000
finalData['나이']
-------------------------------------
one      45
two      30
three    55
Name: 나이, dtype: category
Categories (3, int64): [30, 45, 55]

열을 지정된 데이터 유형(이 경우 ‘category’)으로 변환하는 데 astype() 메서드를 사용합니다. 변환된 열을 원래 데이터프레임 열에 다시 할당하면 새 데이터 유형으로 업데이트 됩니다.


이번 포스팅에서는 Python Pandas 마스터하기 위한 여덟 번째 시간을 가졌습니다( python pandas 마스터하기 71~80 ).
다음 포스팅도 기대해 주세요.
(Python Pandas 마스터하기 81~90 바로가기)

감사합니다!!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다