[python] 판다스, 넘파이

Updated:

Categories:

Tags: , ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

넘파이

  1. 넘파이란 ?
    • 넘파이(NumPy)는 파이썬에서 수치 데이터를 다루기 위한 핵심 라이브러리
    • 넘파이는 대규모 다차원 배열과 행렬을 지원하며, 이들을 효율적으로 조작할 수 있는 다양한 수학 함수를 제공
    • 편의성뿐만 아니라, 속도면에서도 순수 파이썬에 비해 압도적으로 빠르다는 장점이 있다.
    • Numpy의 핵심이라고 불리는 다차원 행렬 자료구조인 ndarray를 통해 벡터 및 행렬을 사용하는 선형 대수 계산에서 주로 사용
  2. 주요 특징
    • 빠른 연산 속도: 넘파이 배열은 파이썬의 기본 리스트보다 훨씬 빠른 연산 속도를 제공
    • 다차원 배열: 넘파이는 다차원 배열 객체인 ndarray를 제공합니다.
    • 벡터화 연산: 복잡한 수학 연산을 단순한 코드로 작성가능
    • 다양한 함수 제공: 수학, 통계, 선형대수 등 다양한 수학 함수를 제공
  3. 넘파이 설치 및 시작하기

    1
    2
    3
    4
    5
    
     # 콘솔에서 설치
     pip install numpy
        
     # import문 작성
     import numpy as np
    
  4. 배열 생성
    • 리스트를 사용하여 배열 생성

      1
      2
      3
      4
      5
      6
      7
      8
      
        # 리스트를 사용하여 1차원 배열 생성
        arr1 = np.array([1, 2, 3, 4, 5])
        print(arr1)  # 출력: [1 2 3 4 5]
              
        # 리스트를 사용하여 2차원 배열 생성
        arr2 = np.array([[1, 2, 3], [4, 5, 6]])
        print(arr2)  # 출력: [[1 2 3]
                     #       [4 5 6]]
      
    • 초기화된 배열 생성

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
        # 모든 요소가 0인 배열 생성
        zeros = np.zeros((3, 3))
        print(zeros)  # 출력: [[0. 0. 0.]
                     #       [0. 0. 0.]
                     #       [0. 0. 0.]]
              
        # 모든 요소가 1인 배열 생성
        ones = np.ones((2, 4))
        print(ones)  # 출력: [[1. 1. 1. 1.]
                     #       [1. 1. 1. 1.]]
              
        # 특정 값으로 초기화된 배열 생성
        full = np.full((3, 3), 7)
        print(full)  # 출력: [[7 7 7]
                     #       [7 7 7]
                     #       [7 7 7]]
              
        # 단위 행렬 생성
        identity = np.eye(4)
        print(identity)  # 출력: [[1. 0. 0. 0.]
                         #       [0. 1. 0. 0.]
                         #       [0. 0. 1. 0.]
                         #       [0. 0. 0. 1.]]
      
    • 연속된 값, 랜덤 값으로 배열 생성

      1
      2
      3
      4
      5
      6
      7
      
        # 연속된 값으로 배열 생성
        sequence = np.arange(10)
        print(sequence)  # 출력: [0 1 2 3 4 5 6 7 8 9]
              
        # 랜덤 값으로 배열 생성
        random_arr = np.random.random((3, 3))
        print(random_arr)  # 출력: 3x3 크기의 랜덤 값 배열
      

      random 패키지의 random 메서드 사용

      자바의 랜덤 메서드처럼 0~ 1사이 숫자의 랜덤값을 생성한다

  5. 배열 속성

    1
    2
    3
    4
    5
    6
    7
    8
    
        
     arr = np.array([[1, 2, 3], [4, 5, 6]])
        
     print(arr.ndim)  # 배열의 차원 수 출력: 2
     print(arr.shape)  # 배열의 형태 출력: (2, 3)
     print(arr.size)  # 배열의 총 요소 수 출력: 6
     print(arr.dtype)  # 배열 요소의 자료형 출력: int64
        
    
  6. 배열 연산

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
     a = np.array([1, 2, 3])
     b = np.array([4, 5, 6])
        
     # 배열 덧셈
     print(a + b)  # 출력: [5 7 9]
        
     # 배열 뺄셈
     print(a - b)  # 출력: [-3 -3 -3]
        
     # 배열 곱셈
     print(a * b)  # 출력: [ 4 10 18]
        
     # 배열 나눗셈
     print(a / b)  # 출력: [0.25 0.4  0.5 ]
        
     # 배열 요소별 제곱
     print(a ** 2)  # 출력: [1 4 9]
        
    
  7. 배열 인덱싱 및 슬라이싱

    1
    2
    3
    4
    5
    6
    7
    8
    
     arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
        
     # 인덱싱
     print(arr[0, 2])  # 출력: 3
        
     # 슬라이싱
     print(arr[1:, 1:])  # 출력: [[5 6]
                         #       [8 9]]
    
  8. 브로드 캐스팅

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        
     a = np.array([1, 2, 3])
     b = np.array([[4], [5], [6]])
        
     print(a + b)
     # 출력: [[5 6 7]
     #       [6 7 8]
     #       [7 8 9]]
        
    
  9. 함수
    • 집계 함수

      1
      2
      3
      4
      5
      6
      
        arr = np.array([1, 2, 3, 4, 5])
              
        print(np.sum(arr))  # 배열 요소의 합 출력: 15
        print(np.mean(arr))  # 배열 요소의 평균 출력: 3.0
        print(np.min(arr))  # 배열 요소의 최솟값 출력: 1
        print(np.max(arr))  # 배열 요소의 최댓값 출력: 5
      
    • 선행대수 함수

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
              
        mat1 = np.array([[1, 2], [3, 4]])
        mat2 = np.array([[5, 6], [7, 8]])
              
        # 행렬 곱
        print(np.dot(mat1, mat2))
        # 출력: [[19 22]
        #       [43 50]]
              
        # 행렬 전치
        print(np.transpose(mat1))
        # 출력: [[1 3]
        #       [2 4]]
              
        # 역행렬
        print(np.linalg.inv(mat1))
        # 출력: [[-2.   1. ]
        #       [ 1.5 -0.5]]
              
      

판다스(Pandas)

  1. 설치 및 시작하기

    1
    2
    3
    4
    5
    
     # 콘솔에 설치
     pip install pandas
        
     # import문 작성
     import pandas as pd
    
  2. 데이터 구조

    판다스는 주로 두 가지 데이터 구조를 사용

    • 시리즈(Series): 1차원 배열
    • 데이터프레임(DataFrame): 2차원 테이블

시리즈

  • 시리즈는 1차원 배열과 같은 자료 구조로, 데이터의 순차적 리스트를 나타냄
  • 각 데이터는 인덱스와 연관되어 있으며, 기본적으로 정수 인덱스를 사용합니다. 하지만 문자열 인덱스도 사용가능.
    1. 시리즈 생성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
        
      import pandas as pd
        
      # 리스트를 사용하여 시리즈 생성
      sr = pd.Series([17000, 18000, 1000, 5000])
      print(sr)
      # 출력:
      # 0    17000
      # 1    18000
      # 2     1000
      # 3     5000
      # dtype: int64
        
      # 인덱스를 지정하여 시리즈 생성
      sr = pd.Series([17000, 18000, 1000, 5000], index=["피자", "치킨", "콜라", "맥주"])
      print(sr)
      # 출력:
      # 피자    17000
      # 치킨    18000
      # 콜라     1000
      # 맥주     5000
      # dtype: int64
        
    
  1. 시리즈의 값과 인덱스 접근

    1
    2
    3
    4
    5
    6
    7
    
        
     # 시리즈의 값
     print(sr.values)  # 출력: [17000 18000  1000  5000]
        
     # 시리즈의 인덱스
     print(sr.index)  # 출력: Index(['피자', '치킨', '콜라', '맥주'], dtype='object')
        
    

데이터프레임 (DataFrame)

스프레드시트 같은 곳의 데이터 타입을 받아와서 사용할 때 주로 사용.

  1. 데이터 프레임이란?
    • 데이터프레임은 2차원 테이블 구조를 가지는 데이터 구조로, 행(row)과 열(column)로 구성
    • 엑셀 스프레드시트나 SQL 테이블과 유사한 구조를 가지며, 다양한 데이터 타입을 저장 가능.
    • 데이터프레임은 여러 시리즈가 모인 형태로 보면 된다.
  2. 데이터프레임 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
        
     # 리스트를 사용하여 데이터프레임 생성
     data = [[1, 'Alice', 23], [2, 'Bob', 25], [3, 'Charlie', 22]]
     df = pd.DataFrame(data, columns=['ID', 'Name', 'Age'])
     print(df)
     # 출력:
     #    ID     Name  Age
     # 0   1    Alice   23
     # 1   2      Bob   25
     # 2   3  Charlie   22
        
     # 딕셔너리를 사용하여 데이터프레임 생성
     data = {'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [23, 25, 22]}
     df = pd.DataFrame(data)
     print(df)
     # 출력:
     #    ID     Name  Age
     # 0   1    Alice   23
     # 1   2      Bob   25
     # 2   3  Charlie   22
        
    
  3. 데이터 프레임의 속성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        
     print(df.index)  # 행 인덱스 출력
     # 출력: RangeIndex(start=0, stop=3, step=1)
        
     print(df.columns)  # 열 이름 출력
     # 출력: Index(['ID', 'Name', 'Age'], dtype='object')
        
     print(df.values)  # 값 출력
     # 출력:
     # [[1 'Alice' 23]
     #  [2 'Bob' 25]
     #  [3 'Charlie' 22]]
        
    
  4. 데이터 조작 및 선택
    • 필터링

      1
      2
      3
      4
      
        print(df[df['Age'] > 23])
        # 출력:
        #    ID Name  Age
        # 1   2  Bob   25
      
    • 데이터 추가 1. 열추가

      1
      2
      3
      4
      5
      6
      7
      
        df['City'] = ['New York', 'Los Angeles', 'Chicago']
        print(df)
        # 출력:
        #    ID     Name  Age         City
        # 0   1    Alice   23     New York
        # 1   2      Bob   25  Los Angeles
        # 2   3  Charlie   22      Chicago
      
    • 데이터 추가 2. 행 추가

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
        new_row = {'ID': 4, 'Name': 'David', 'Age': 24, 'City': 'San Francisco'}
        df = df.append(new_row, ignore_index=True)
        print(df)
        # 출력:
        #    ID     Name  Age           City
        # 0   1    Alice   23       New York
        # 1   2      Bob   25    Los Angeles
        # 2   3  Charlie   22        Chicago
        # 3   4    David   24  San Francisco
      
    • 데이터 수정

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
              
        df.loc[0, 'Age'] = 24
        print(df)
        # 출력:
        #    ID     Name  Age           City
        # 0   1    Alice   24       New York
        # 1   2      Bob   25    Los Angeles
        # 2   3  Charlie   22        Chicago
        # 3   4    David   24  San Francisco
      
    • 데이터 삭제 1. 열 삭제

      1
      2
      3
      4
      5
      6
      7
      8
      
        df = df.drop('City', axis=1)
        print(df)
        # 출력:
        #    ID     Name  Age
        # 0   1    Alice   24
        # 1   2      Bob   25
        # 2   3  Charlie   22
        # 3   4    David   24
      
    • 데이터 삭제 2. 행 삭제

      1
      2
      3
      4
      5
      6
      7
      
        df = df.drop(0, axis=0)
        print(df)
        # 출력:
        #    ID     Name  Age
        # 1   2      Bob   25
        # 2   3  Charlie   22
        # 3   4    David   24
      
  5. 데이터 프레임 결합
    • concat 사용한 결합

      여러 데이터프레임을 위아래로 또는 좌우로 결합 가능

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      
              
        df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
        df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})
              
        result = pd.concat([df1, df2])
        print(result)
        # 출력:
        #     A   B
        # 0  A0  B0
        # 1  A1  B1
        # 2  A2  B2
        # 0  A3  B3
        # 1  A4  B4
        # 2  A5  B5
      
    • merge 사용한 결합

      SQL의 JOIN 연산처럼 두 데이터프레임을 결합 가능

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
              
        left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
        right = pd.DataFrame({'key': ['K0', 'K1', 'K3'], 'B': ['B0', 'B1', 'B3']})
              
        result = pd.merge(left, right, on='key')
        print(result)
        # 출력:
        #   key   A   B
        # 0  K0  A0  B0
        # 1  K1  A1  B1
      
  6. 그룹화 및 집계
    • groupby를 사용한 그룹화

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
              
        data = {'Team': ['A', 'B', 'A', 'B'], 'Points': [10, 20, 30, 40]}
        df = pd.DataFrame(data)
        grouped = df.groupby('Team')
              
        print(grouped.sum())
        # 출력:
        #       Points
        # Team
        # A         40
        # B         60
              
      
    • 집계함수 : 그룹화한 데이터에 대해 다양한 집계 함수를 적용

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      
        print(grouped['Points'].mean())
        # 출력:
        # Team
        # A    20.0
        # B    30.0
        # Name: Points, dtype: float64
              
        print(grouped['Points'].sum())
        # 출력:
        # Team
        # A    40
        # B    60
        # Name: Points, dtype: int64
              
        print(grouped['Points'].min())
        # 출력:
        # Team
        # A    10
        # B    20
        # Name: Points, dtype: int64
              
        print(grouped['Points'].max())
        # 출력:
        # Team
        # A    30
        # B    40
        # Name: Points, dtype: int64
              
        print(grouped['Points'].count())
        # 출력:
        # Team
        # A    2
        # B    2
        # Name: Points, dtype: int64
      
  7. 결측치 처리
    • 결측지 확인

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      
        df = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6], 'C': [None, 8, 9]})
        print(df)
        # 출력:
        #      A    B    C
        # 0  1.0  4.0  NaN
        # 1  2.0  NaN  8.0
        # 2  NaN  6.0  9.0
              
        print(df.isnull())
        # 출력:
        #        A      B      C
        # 0  False  False   True
        # 1  False   True  False
        # 2   True  False  False
              
        print(df.isnull().sum())
        # 출력:
        # A    1
        # B    1
        # C    1
        # dtype: int64
              
      
    • 결측치 제거

      1
      2
      3
      4
      5
      6
      
        df = df.dropna()
        print(df)
        # 출력:
        # Empty DataFrame
        # Columns: [A, B, C]
        # Index: []
      
    • 결측치 대체

      1
      2
      3
      4
      5
      6
      7
      8
      
        df = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6], 'C': [None, 8, 9]})
        df['A'] = df['A'].fillna(df['A'].mean())
        print(df)
        # 출력:
        #           A    B    C
        # 0  1.000000  4.0  NaN
        # 1  2.000000  NaN  8.0
        # 2  1.500000  6.0  9.0
      
  8. 데이터 정렬
    • 인덱스 기준

      1
      2
      3
      4
      5
      6
      7
      
        df = df.sort_index()
        print(df)
        # 출력:
        #           A    B    C
        # 0  1.000000  4.0  NaN
        # 1  2.000000  NaN  8.0
        # 2  1.500000  6.0  9.0
      
    • 값을 기준

      1
      2
      3
      4
      5
      6
      7
      8
      
              
        df = df.sort_values(by='A')
        print(df)
        # 출력:
        #           A    B    C
        # 0  1.000000  4.0  NaN
        # 2  1.500000  6.0  9.0
        # 1  2.000000  NaN  8.0
      
  9. 데이터 저장

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
     import pandas as pd
        
     df = pd.DataFrame({'Team': ['A', 'B', 'A', 'B'], 'Point': [10, 20, 30, 40]})
     group = df.groupby('Team')
        
     #print를 하면 주소 값만 출력된다
        
     print(group.mean())
        
     # 이렇게 해도 포인트밖에 없어서 출력은 되지만 기준을 정해주는 것이 좋다.\
        
     print(group['Point'].mean())
     print(group['Point'].count())
        
     # csv와 엑셀 파일로 저장.
        
     df.to_csv('output.csv', index=False)
     df.to_excel('output.xlsx', index=False)
    

    Untitled

python 카테고리 내 다른 글 보러가기

Leave a comment