본문 바로가기
Python

[Python] - DataFrame 개념 및 예제 코드

by nam_ji 2024. 10. 22.

파이썬(Python) 판다스(Pandas) 데이터프레임(DataFrame) 개념 및 예제 코드

판다스란?

  • Pandas는 Python에서 데이터를 다룰 때 사용하는 강력하고 유용한 라이브러리입니다.
  • 특히 표 형식의 데이터(예: Excel, CSV, SQL 데이터 베이스 등) 처리에 매우 유용합니다.
  • 데이터 분석 및 조작을 쉽게 할 수 있게 도와주며, 빠르고 효율적인 방식으로 데이터를 다룰 수 있는 도구들을 제공합니다.
  • Pandas 특징
    • 데이터 분석: Pandas는 데이터를 필터링, 정렬, 변환, 요약하는 등 다양한 데이터 분석 작업을 쉽게 처리할 수 있는 도구들을 제공합니다.
    • 성능: 데이터를 효율적으로 처리할 수 있게 설계되어, 대량의 데이터를 다룰 때도 빠르게 동작합니다.
    • 호환성: 다양한 데이터 형식(CSV, Excel, SQL등)과 호환되어 데이터를 쉽게 읽고 쓸 수 있습니다.
    • 편리한 데이터 처리: Pandas는 NaN(결측치) 값 처리, 중복 데이터 처리, 그룹화, 피벗 테이블 등 복잡한 데이터 작업을 손쉽게 할 수 있도록 도와줍니다.
  • Pandas의 주요 구성 요소
    • Series: Pandas에서 데이터를 1차원 배열로 표현하는 객체입니다.
    • DataFrame: 데이터를 2차원 표 형태로 표현하는 객체로, 행(row)과 열(column)로 이루어진 데이터 구조입니다. 주로 데이터를 다룰 때 가장 많이 사용됩니다.

데이터프레임이란?

  • DataFrame은 Pandas에서 가장 중요한 데이터 구조로, 2차원 배열 형태로 데이터를 다루는 데 사용됩니다.
  • 행과 열로 이루어져 있으며, 각 열은 서로 다른 데이터 타입을 가질 수 있습니다.
  • 예를 들어 하나의 열에는 숫자가 있고, 다른 열에는 문자열이 있을 수 있습니다.
  • DataFrame 특징
    • 2차원 구조: DataFrame은 행(row)과 열(column)로 데이터를 구성합니다.
    • 유연성: 각 열은 서로 다른 데이터 타입(숫자, 문자열, 날짜 등)을 가질 수 있어 다양한 형태의 데이터를 쉽게 다룰 수 있습니다.
    • 라벨 기반 접근: 각 행과 열은 인덱스와 컬럼 이름을 통해 접근할 수 있어, 위치 기반(index-based) 또는 라벨 이름(label-bases)으로 데이터를 쉽게 선택하고 조작할 수 있습니다.
    • 다양한 데이터 형식 지원: CSV 파일, Excel 파일, SQL 데이터베이스, JSON 등 다양한 형식으로 데이터를 읽고 쓸 수 있습니다.

데이터프레임 기본 예제

1. 데이터 프레임 생성

  • pandas의 DataFrame은 2차원 표 형식의 데이터를 다루는데 사용됩니다.
  • 생성 방법
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
            print(f"데이터 프레임 생성:\n{df}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
    
    '''
    출력
    --------------데이터 프레임 생성--------------
    데이터 프레임 생성:
        이름  나이 성별
    0  홍길동  25  남
    1  김철수  30  남
    2  이영희  22  여
    '''
  • import pandas as pd: pandas 라이브러리를 pd라는 이름으로 불러옵니다.
  • data = {...}: 딕셔너리 형태로 데이터를 생성합니다. 딕셔너리의 키는 열 이름이 되고, 값은 각 열에 들어갈 데이터 목록입니다. 예를 들어, '이름': ['홍길동', '김철수', '이영희']는 이름 열에 들어갈 값을 지정한 것입니다.
  • 위 코드처럼 작성하면 이름, 나이, 성별이라는 세 개의 열을 가진 데이터 프레임을 생성할 수 있습니다.

2. 데이터 프레임의 기본 정보 확인

  • 생성한 데이터 프레임의 기본 정보를 확인할 수 있습니다.
  • 확인 방법 
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
            print(f"데이터 프레임 생성:\n{df}")
    
            print("\n--------------데이터 프레임 기본 정보 확인--------------")
            # 데이터 프레임 정보 출력
            print(f"df.info():\n{df.info()}")
            # 데이터 프레임의 통계 요약 출력
            print(f"\ndf.describe():\n{df.describe()}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
    
    '''
    출력
    --------------데이터 프레임 기본 정보 확인--------------
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 3 entries, 0 to 2
    Data columns (total 3 columns):
     #   Column  Non-Null Count  Dtype 
    ---  ------  --------------  ----- 
     0   이름      3 non-null      object
     1   나이      3 non-null      int64 
     2   성별      3 non-null      object
    dtypes: int64(1), object(2)
    memory usage: 200.0+ bytes
    df.info():
    None
    
    df.describe():
                  나이
    count   3.000000
    mean   25.666667
    std     4.041452
    min    22.000000
    25%    23.500000
    50%    25.000000
    75%    27.500000
    max    30.000000
    '''
  • 위 코드처럼 생성된 데이터 프레임을 info()함수로 데이터 프레임의 각 열에 대한 데이터 타입과 결측치 여부를 확인할 수 있고, describe() 함수는 수치형 데이터에 대한 통계 요약 정보를 제공합니다.

3. 데이터 선택 및 필터링

  • 데이터 프레임에서 특정 열이나 행을 선택하거나 조건에 맞는 데이터를 필터링할 수 있습니다.
  • 설정 방법
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
            
            print("\n--------------데이터 선택 및 필터링--------------")
            # 특정 열 선택
            print(f"특정 열 선택:\n{df['이름']}")
            # 여러 열 선택
            print(f"\n여러 열 선택:\n{df[['이름', '나이']]}")
            # 조건에 맞는 행 필터링
            print(f"\n조건에 맞는 행 필터링:\n{df[df['나이'] > 25]}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
        
    '''
    출력
    --------------데이터 선택 및 필터링--------------
    특정 열 선택:
    0    홍길동
    1    김철수
    2    이영희
    Name: 이름, dtype: object
    
    여러 열 선택:
        이름  나이
    0  홍길동  25
    1  김철수  30
    2  이영희  22
    
    조건에 맞는 행 필터링:
        이름  나이 성별
    1  김철수  30  남
    '''
  • 위 코드에서 이름 열을 선택하고, 이름과 나이 열을 동시에 선택하며, 나이가 25보다 큰 행을 필터링하는 예시를 보여주고 있습니다.

4. 데이터 추가 및 삭제

  • 데이터 프레임에 새로운 열을 추가하거나 기존 열을 삭제할 수 있습니다.
  • 방법
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
    
            print("\n--------------데이터 추가 및 삭제--------------")
            # 데이터 추가
            df['국가'] = ['한국', '한국', '한국']
            print(f"데이터 추가:\n{df}")
            # 열 삭제
            df = df.drop('국가', axis=1)
            print(f"\n열 삭제:\n{df}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
    
    '''
    출력
    --------------데이터 추가 및 삭제--------------
    데이터 추가:
        이름  나이 성별  국가
    0  홍길동  25  남  한국
    1  김철수  30  남  한국
    2  이영희  22  여  한국
    
    열 삭제:
        이름  나이 성별
    0  홍길동  25  남
    1  김철수  30  남
    2  이영희  22  여
    '''
  • 국가 열을 추가한 후, drop 함수를 사용하여 해당 열을 삭제합니다.

5. 데이터 정렬

  • 데이터 프레임의 데이터를 특정 열을 기준으로 정렬할 수 있습니다.
  • 방법
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
            
            print("\n--------------데이터 정렬--------------")
            # 데이터 프레임 오름차순 정렬
            print(f"나이 기준 오름차순 정렬:\n{df.sort_values('나이')}")
            # 데이터 프레임 내림차순 정렬
            print(f"\n나이 기준 내림차순 정렬:\n{df.sort_values('나이', ascending=False)}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
        
    '''
    출력
    --------------데이터 정렬--------------
    나이 기준 오름차순 정렬:
        이름  나이 성별
    2  이영희  22  여
    0  홍길동  25  남
    1  김철수  30  남
    
    나이 기준 내림차순 정렬:
        이름  나이 성별
    1  김철수  30  남
    0  홍길동  25  남
    2  이영희  22  여
    '''
  • sort_values() 함수를 사용하여 나이 열을 기준으로 데이터를 정렬하였습니다.

6. 데이터 통계 분석

  • 데이터 프레임의 수치형 데이터에 대한 통계 분석을 수행할 수 있습니다.
  • 방법
    더보기
    import pandas as pd
    
    
    class DataFrameBasic:
        def data_frame_basic(self):
            print("판다스 데이터 프레임 활용 예제\n")
    
            print("--------------데이터 프레임 생성--------------")
            data = {
                '이름': ['홍길동', '김철수', '이영희'],
                '나이': [25, 30, 22],
                '성별': ['남', '남', '여']
            }
            # 데이터 프레임 생성 방법
            df = pd.DataFrame(data)
            
            print("\n--------------데이터 통계 분석--------------")
            # 나이 열의 평균
            print(f"나이 열의 평균: {df['나이'].mean()}")
            # 나이 열의 최대값
            print(f"나이 열의 최대값: {df['나이'].max()}")
            # 나이 열의 최소값
            print(f"나이 열의 최소값: {df['나이'].min()}")
    
    if __name__ == '__main__':
        dfb = DataFrameBasic()
        dfb.data_frame_basic()
    
    '''
    출력
    --------------데이터 통계 분석--------------
    나이 열의 평균: 25.666666666666668
    나이 열의 최대값: 30
    나이 열의 최소값: 22
    '''
  • mean(), max(), min() 함수를 사용하여 나이 열의 평균, 최대값, 최소값을 구했습니다.

데이터프레임 심화 예제

1. 그룹화 및 집계

  • 먼저, 데이터를 pandas의 DataFrame 객체로 변환하여 사용합니다.
  • 생성된 데이터를 바탕으로, pandas의 groupby() 함수를 사용하여 부서별 급여 평균을 구합니다.
  • 방법
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
    
            print("\n--------------데이터 프레임 그룹화 및 집계--------------")
            # 예시 데이터 생성
            data = {
                '부서': ['IT', 'HR', 'IT', 'HR', 'IT', 'HR'],
                '직원': ['홍길동', '김철수', '이영희', '박민수', '최지은', '장소연'],
                '나이': [25, 30, 22, 35, 28, 24],
                '급여': [5000, 4000, 4500, 4200, 5500, 3800]
            }
            df = pd.DataFrame(data)
    
            # 부서별로 급여의 평균을 구합니다.
            grouped = df.groupby('부서')['급여'].mean()
            print(f"부서별 급여 평균:\n{grouped}")
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()
        
    '''
    출력
    --------------데이터 프레임 그룹화 및 집계--------------
    부서별 급여 평균:
    부서
    HR    4000.0
    IT    5000.0
    Name: 급여, dtype: float64
    '''


2. 결측치 처리

  • 결측치를 처리 방법으로 두 가지를 보겠습니다.
  • 첫 번째로, 결측치를 포함한 행을 삭제하는 방법입니다.
  • 두 번째로, 결측치를 각 열의 평균 값으로 채우는 방법입니다.
  • 방법
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
            
            print("\n--------------데이터 프레임 결측치 처리--------------")
            # 결측치를 포함한 데이터 생성
            data_with_na = {
                '이름': ['홍길동', '김철수', '이영희', None, '최지은'],
                '나이': [25, 30, None, 35, 28],
                '성별': ['남', '남', '여', '남', '여'],
                '급여': [5000, 4000, 4500, 4200, None]
            }
            df_with_na = pd.DataFrame(data_with_na)
    
            #결측치가 있는 행 제거
            df_no_na = df_with_na.dropna()
            print(f"결측치가 제거된 데이터:\n{df_no_na}")
    
            # 결측치를 각 열의 평균값으로 채우기
            df_filled = df_with_na.fillna(df_with_na.mean(numeric_only=True))
            print(f"\n결측치를 평균으로 채운 데이터:\n{df_filled}")
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()
        
    '''
    출력
    --------------데이터 프레임 결측치 처리--------------
    결측치가 제거된 데이터:
        이름    나이 성별      급여
    0  홍길동  25.0  남  5000.0
    1  김철수  30.0  남  4000.0
    
    결측치를 평균으로 채운 데이터:
         이름    나이 성별      급여
    0   홍길동  25.0  남  5000.0
    1   김철수  30.0  남  4000.0
    2   이영희  29.5  여  4500.0
    3  None  35.0  남  4200.0
    4   최지은  28.0  여  4425.0
    '''
  • dropna(): 결측치가 있는 모든 행을 제거합니다.
  • fillna(): 결측치를 특정 값으로 대체하는데, 여기서는 각 열의 평균값으로 채우는 방법을 사용합니다.

3. 조건부 변환 및 필터링

  • 조건부 변환 (급여 인상)
  • 데이터의 직원들 급여를 조건에 따라 10% 인상하는 방법입니다.
  • apply() 함수는 각 데이터에 대해 사용자 정의 함수를 적용할 수 있습니다. 여기서는 급여가 4200 이상인 직원들에게만 급여를 10% 인상하는 로직을 구현했습니다.
  • 나이 필터링
  • 데이터에서 30세 이상 직원만 필터링하여 새로운 데이터 프레임을 만드는 방법입니다.
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
    
            print("\n--------------데이터 프레임 조건부 변환 및 필터링--------------")
            # 직원들의 급여를 10% 인상
            df['급여'] = df['급여'].apply(lambda x: x * 1.1 if x >= 4200 else x)
            print(f"급여를 10% 인상한 데이터:\n{df}")
    
            # 나이가 30 이상인 직원만 필터링
            filtered_df = df[df['나이'] >= 30]
            print(f"\n나이가 30 이상인 직원들:\n{filtered_df}")
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()
        
    '''
    출력
    --------------데이터 프레임 조건부 변환 및 필터링--------------
    급여를 10% 인상한 데이터:
       부서   직원  나이      급여
    0  IT  홍길동  25  5500.0
    1  HR  김철수  30  4000.0
    2  IT  이영희  22  4950.0
    3  HR  박민수  35  4620.0
    4  IT  최지은  28  6050.0
    5  HR  장소연  24  3800.0
    
    나이가 30 이상인 직원들:
       부서   직원  나이      급여
    1  HR  김철수  30  4000.0
    3  HR  박민수  35  4620.0
    '''

4. 데이터 프레임을 다른 형식으로 변환

  • CSV 파일과 Excel 파일로 변환 저장
  • 데이터 프레임의 to_csv와 to_excel 함수를 사용하면 변환할 수 있습니다.
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
    
            print("\n--------------데이터 프레임을 다른 형식으로 변환--------------")
            # 데이터 프레임을 CSV 파일로 저장
            df.to_csv(r'C:\WorkSpace\python-basic\data\employee_data.csv', index=False)
            print("데이터 프레임을 CSV 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.")
    
            # 데이터 프레임을 Excel 파일로 저장
            df.to_excel(r'C:\WorkSpace\python-basic\data\employee_data.xlsx', index=False)
            print("데이터 프레임을 Excel 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.")
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()

5. 데이터의 피벗 테이블 생성

  • 피벗 테이블은 데이터를 특정 기준으로 그룹화하고, 그 그룹에 대해 집계 작업을 수행할 수 있게 도와줍니다.
  • pivot_table() 함수는 aggfunc 파라미터를 사용하여 집계 함수를 지정할 수 있습니다.
  • 아래 예제는 각 부서의 평균 나이를 계산했습니다.
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
    
            print("\n--------------데이터 프레임으로 피벗 테이블 생성--------------")
            pivot_table = df.pivot_table(values='나이', index='부서', aggfunc='mean')
            # 부서별로 나이의 평균을 구하는 피벗 테이블 생성
            print(f"부서별 나이 평균 피벗 테이블:\n{pivot_table}")
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()
        
    '''
    출력
    --------------데이터 프레임으로 피벗 테이블 생성--------------
    부서별 나이 평균 피벗 테이블:
               나이
    부서           
    HR  29.666667
    IT  25.000000
    '''

6. 데이터 시각화

  • matplotlib 라이브러리를 사용하여 부서별 평균 급여를 시각화 해봤습니다.
  • 아래 예제는 부서별 평균 급여를 막대 그래프로 표시하였으며, rc() 함수로 한글이 깨지지 않도록 설정을 추가했습니다.
    더보기
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    class DataFrameDeepening:
        def data_frame_deepening(self):
            print("판다스 데이터 프레임 활용 예제 심화")
    
            print("\n--------------데이터 프레임으로 데이터 시각화--------------")
            grouped_df = df.groupby('부서')['급여'].mean()
    
            # Window 환경 한글 설정
            plt.rc('font', family='Malgun Gothic')
            # 음수가 깨지지 않도록 설정
            plt.rcParams['axes.unicode_minus'] = False
            # 그래프 형태
            grouped_df.plot(kind='bar')
            # 제목
            plt.title('부서별 평균 급여')
            # x축
            plt.xlabel('부서')
            # y축
            plt.ylabel('평균 급여')
            # View
            plt.show()
    
    if __name__ == '__main__':
        data_frame_deepening = DataFrameDeepening()
        data_frame_deepening.data_frame_deepening()


전체 코드

1. 데이터 프레임 활용 기초

더보기
import pandas as pd


class DataFrameBasic:
    def data_frame_basic(self):
        print("판다스 데이터 프레임 활용 예제\n")

        print("--------------데이터 프레임 생성--------------")
        data = {
            '이름': ['홍길동', '김철수', '이영희'],
            '나이': [25, 30, 22],
            '성별': ['남', '남', '여']
        }
        # 데이터 프레임 생성 방법
        df = pd.DataFrame(data)
        print(f"데이터 프레임 생성:\n{df}")

        print("\n--------------데이터 프레임 기본 정보 확인--------------")
        # 데이터 프레임 정보 출력
        print(f"df.info():\n{df.info()}")
        # 데이터 프레임의 통계 요약 출력
        print(f"\ndf.describe():\n{df.describe()}")

        print("\n--------------데이터 선택 및 필터링--------------")
        # 특정 열 선택
        print(f"특정 열 선택:\n{df['이름']}")
        # 여러 열 선택
        print(f"\n여러 열 선택:\n{df[['이름', '나이']]}")
        # 조건에 맞는 행 필터링
        print(f"\n조건에 맞는 행 필터링:\n{df[df['나이'] > 25]}")

        print("\n--------------데이터 추가 및 삭제--------------")
        # 데이터 추가
        df['국가'] = ['한국', '한국', '한국']
        print(f"데이터 추가:\n{df}")
        # 열 삭제
        df = df.drop('국가', axis=1)
        print(f"\n열 삭제:\n{df}")

        print("\n--------------데이터 정렬--------------")
        # 데이터 프레임 오름차순 정렬
        print(f"나이 기준 오름차순 정렬:\n{df.sort_values('나이')}")
        # 데이터 프레임 내림차순 정렬
        print(f"\n나이 기준 내림차순 정렬:\n{df.sort_values('나이', ascending=False)}")

        print("\n--------------데이터 통계 분석--------------")
        # 나이 열의 평균
        print(f"나이 열의 평균: {df['나이'].mean()}")
        # 나이 열의 최대값
        print(f"나이 열의 최대값: {df['나이'].max()}")
        # 나이 열의 최소값
        print(f"나이 열의 최소값: {df['나이'].min()}")

if __name__ == '__main__':
    dfb = DataFrameBasic()
    dfb.data_frame_basic()
    
'''
출력
판다스 데이터 프레임 활용 예제

--------------데이터 프레임 생성--------------
데이터 프레임 생성:
    이름  나이 성별
0  홍길동  25  남
1  김철수  30  남
2  이영희  22  여

--------------데이터 프레임 기본 정보 확인--------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   이름      3 non-null      object
 1   나이      3 non-null      int64 
 2   성별      3 non-null      object
dtypes: int64(1), object(2)
memory usage: 200.0+ bytes
df.info():
None

df.describe():
              나이
count   3.000000
mean   25.666667
std     4.041452
min    22.000000
25%    23.500000
50%    25.000000
75%    27.500000
max    30.000000

--------------데이터 선택 및 필터링--------------
특정 열 선택:
0    홍길동
1    김철수
2    이영희
Name: 이름, dtype: object

여러 열 선택:
    이름  나이
0  홍길동  25
1  김철수  30
2  이영희  22

조건에 맞는 행 필터링:
    이름  나이 성별
1  김철수  30  남

--------------데이터 추가 및 삭제--------------
데이터 추가:
    이름  나이 성별  국가
0  홍길동  25  남  한국
1  김철수  30  남  한국
2  이영희  22  여  한국

열 삭제:
    이름  나이 성별
0  홍길동  25  남
1  김철수  30  남
2  이영희  22  여

--------------데이터 정렬--------------
나이 기준 오름차순 정렬:
    이름  나이 성별
2  이영희  22  여
0  홍길동  25  남
1  김철수  30  남

나이 기준 내림차순 정렬:
    이름  나이 성별
1  김철수  30  남
0  홍길동  25  남
2  이영희  22  여

--------------데이터 통계 분석--------------
나이 열의 평균: 25.666666666666668
나이 열의 최대값: 30
나이 열의 최소값: 22
'''

2. 데이터 프레임 활용 심화

더보기
import pandas as pd
import matplotlib.pyplot as plt


class DataFrameDeepening:
    def data_frame_deepening(self):
        print("판다스 데이터 프레임 활용 예제 심화")

        print("\n--------------데이터 프레임 그룹화 및 집계--------------")
        # 예시 데이터 생성
        data = {
            '부서': ['IT', 'HR', 'IT', 'HR', 'IT', 'HR'],
            '직원': ['홍길동', '김철수', '이영희', '박민수', '최지은', '장소연'],
            '나이': [25, 30, 22, 35, 28, 24],
            '급여': [5000, 4000, 4500, 4200, 5500, 3800]
        }
        df = pd.DataFrame(data)

        # 부서별로 급여의 평균을 구합니다.
        grouped = df.groupby('부서')['급여'].mean()
        print(f"부서별 급여 평균:\n{grouped}")

        print("\n--------------데이터 프레임 결측치 처리--------------")
        # 결측치를 포함한 데이터 생성
        data_with_na = {
            '이름': ['홍길동', '김철수', '이영희', None, '최지은'],
            '나이': [25, 30, None, 35, 28],
            '성별': ['남', '남', '여', '남', '여'],
            '급여': [5000, 4000, 4500, 4200, None]
        }
        df_with_na = pd.DataFrame(data_with_na)

        #결측치가 있는 행 제거
        df_no_na = df_with_na.dropna()
        print(f"결측치가 제거된 데이터:\n{df_no_na}")

        # 결측치를 각 열의 평균값으로 채우기
        df_filled = df_with_na.fillna(df_with_na.mean(numeric_only=True))
        print(f"\n결측치를 평균으로 채운 데이터:\n{df_filled}")

        print("\n--------------데이터 프레임 조건부 변환 및 필터링--------------")
        # 직원들의 급여를 10% 인상
        df['급여'] = df['급여'].apply(lambda x: x * 1.1 if x >= 4200 else x)
        print(f"급여를 10% 인상한 데이터:\n{df}")

        # 나이가 30 이상인 직원만 필터링
        filtered_df = df[df['나이'] >= 30]
        print(f"\n나이가 30 이상인 직원들:\n{filtered_df}")

        print("\n--------------데이터 프레임을 다른 형식으로 변환--------------")
        # 데이터 프레임을 CSV 파일로 저장
        df.to_csv(r'C:\WorkSpace\python-basic\data\employee_data.csv', index=False)
        print("데이터 프레임을 CSV 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.")

        # 데이터 프레임을 Excel 파일로 저장
        df.to_excel(r'C:\WorkSpace\python-basic\data\employee_data.xlsx', index=False)
        print("데이터 프레임을 Excel 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.")

        print("\n--------------데이터 프레임으로 피벗 테이블 생성--------------")
        pivot_table = df.pivot_table(values='나이', index='부서', aggfunc='mean')
        # 부서별로 나이의 평균을 구하는 피벗 테이블 생성
        print(f"부서별 나이 평균 피벗 테이블:\n{pivot_table}")

        print("\n--------------데이터 프레임으로 데이터 시각화--------------")
        grouped_df = df.groupby('부서')['급여'].mean()

        # Window 환경 한글 설정
        plt.rc('font', family='Malgun Gothic')
        # 음수가 깨지지 않도록 설정
        plt.rcParams['axes.unicode_minus'] = False
        # 그래프 형태
        grouped_df.plot(kind='bar')
        # 제목
        plt.title('부서별 평균 급여')
        # x축
        plt.xlabel('부서')
        # y축
        plt.ylabel('평균 급여')
        # View
        plt.show()

if __name__ == '__main__':
    data_frame_deepening = DataFrameDeepening()
    data_frame_deepening.data_frame_deepening()
    
'''
출력
--------------데이터 프레임 그룹화 및 집계--------------
부서별 급여 평균:
부서
HR    4000.0
IT    5000.0
Name: 급여, dtype: float64

--------------데이터 프레임 결측치 처리--------------
결측치가 제거된 데이터:
    이름    나이 성별      급여
0  홍길동  25.0  남  5000.0
1  김철수  30.0  남  4000.0

결측치를 평균으로 채운 데이터:
     이름    나이 성별      급여
0   홍길동  25.0  남  5000.0
1   김철수  30.0  남  4000.0
2   이영희  29.5  여  4500.0
3  None  35.0  남  4200.0
4   최지은  28.0  여  4425.0

--------------데이터 프레임 조건부 변환 및 필터링--------------
급여를 10% 인상한 데이터:
   부서   직원  나이      급여
0  IT  홍길동  25  5500.0
1  HR  김철수  30  4000.0
2  IT  이영희  22  4950.0
3  HR  박민수  35  4620.0
4  IT  최지은  28  6050.0
5  HR  장소연  24  3800.0

나이가 30 이상인 직원들:
   부서   직원  나이      급여
1  HR  김철수  30  4000.0
3  HR  박민수  35  4620.0

--------------데이터 프레임을 다른 형식으로 변환--------------
데이터 프레임을 CSV 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.
데이터 프레임을 Excel 파일로 변환 후 python-baisc의 data 패키지에 저장했습니다.

--------------데이터 프레임으로 피벗 테이블 생성--------------
부서별 나이 평균 피벗 테이블:
           나이
부서           
HR  29.666667
IT  25.000000

--------------데이터 프레임으로 데이터 시각화--------------
'''