Pandas 란? (1)

쓰리원·2023년 6월 18일

Data Analysis

목록 보기
2/4
post-thumbnail

1. Pandas 란?

1-1. pandas 개요

pandas는 데이터 분석과 조작을 위해 설계된 파이썬 라이브러리로, 특히 구조화된 데이터(예: 테이블 형태의 데이터) 처리에 강력하다. pandas는 데이터프레임(DataFrame)이라는 구조를 중심으로 빠르고 직관적인 데이터 처리 및 분석을 지원한다.

pandas는 매우 잘 정리된 공식 문서를 제공한다. 문서에는 함수별 설명, 예제, 사용 방법이 모두 포함되어 있다. 공식 문서 링크는 다음과 같다.

Pandas 공식문서 링크 : https://pandas.pydata.org/docs/

  • pandas의 특장점
    • 복잡한 데이터를 간단하게 조작할 수 있는 고수준의 API를 제공한다.
    • CSV, Excel, SQL 등 다양한 데이터 소스를 지원하여, 불러오거나 저장할 수 있다.
    • 기본적인 통계 연산부터 복잡한 데이터 집계 및 그룹화까지 강력한 분석 도구들을 제공한다.
    • matplotlib 및 seaborn과 같은 시각화 라이브러리와 쉽게 연동 가능하다.

1-2. 다른 라이브러리와 비교 (NumPy, SQL, Excel)

  • pandas와 NumPy
    • NumPy는 수치 계산을 위한 배열 기반의 라이브러리이고, pandas는 이를 기반으로 더 복잡한 데이터 구조를 다룬다.
    • pandas는 NumPy 배열을 내부적으로 사용하여 더 효율적으로 대규모 데이터를 처리하지만, 데이터 조작이나 분석에 있어 더 높은 수준의 기능을 제공한다.
  • pandas와 SQL
    • SQL은 데이터베이스에서 데이터를 다루는 언어이며, pandas는 로컬 환경에서 데이터를 다룬다.
    • pandas의 DataFrame은 SQL의 테이블과 유사하며, pandas에서는 SQL에서 하는 연산들(선택, 필터링, 조인 등)을 쉽게 수행할 수 있다.
  • pandas와 Excel
    • Excel은 GUI 기반의 스프레드시트 소프트웨어로 데이터 분석에 널리 사용되지만, 대규모 데이터 처리나 자동화에는 한계가 있다.
    • pandas는 Excel에서 할 수 있는 대부분의 기능을 코드로 구현할 수 있으며, 특히 데이터의 크기가 커지면 pandas가 훨씬 효율적이다.

2. pandas 데이터 구조

2-1. pandas 데이터 구조 개요

pandas는 Series와 DataFrame라고 하는 두 가지 주요 데이터 구조를 제공하며, 이것들은 데이터 조작과 분석에 매우 중요한 역할을 한다.

  • Series: 1차원 배열로, 인덱스를 포함하며 데이터를 저장한다. (데이터에 고유한 인덱스를 부여하여 데이터에 접근할 수 있다.)

  • DataFrame: 2차원 테이블 형식의 데이터 구조로 여러 개의 Series가 모여 테이블을 이루며, 각 컬럼은 동일한 인덱스를 공유한다. (행과 열 모두 인덱스를 통해 접근할 수 있다.)

2-2. Series

pandas의 Series는 NumPy의 1차원 배열과 유사하며, 인덱스와 데이터를 함께 저장한다. 데이터는 숫자, 문자열, 불리언, 또는 다른 데이터 타입을 포함할 수 있다.

  • 생성 방법
    • Series는 pd.Series() 함수를 사용하여 생성할 수 있다. 예를 들어, 리스트나 NumPy 배열을 이용해 Series를 만들 수 있다.
        import pandas as pd
        
        # 리스트로 Series 생성
        s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
        print(s)
        print(s.dtype) 
        
    	a    10
		b    20
		c    30
		d    40
		dtype: int64
  • 특징

    • 각 데이터는 고유한 인덱스를 가지며, 이를 통해 데이터에 쉽게 접근할 수 있다.
    • dtype은 Series 내부의 데이터 타입을 나타낸다.
  • 데이터 선택

    • Series의 각 값은 인덱스를 이용해 선택할 수 있다.
      # 인덱스를 이용한 선택
      print(s['b'])  # 20

2-3. DataFrame

DataFrame은 행(row)과 열(column)로 이루어진 2차원 데이터 구조로, 다양한 데이터 타입을 포함할 수 있다. DataFrame은 엑셀 시트나 SQL 테이블과 유사한 구조를 가지고 있다.

  • 생성 방법
    • DataFrame은 다양한 방법으로 생성할 수 있다. 대표적인 방법으로는 딕셔너리 또는 리스트를 사용하는 방법이 있다.
        data = {
            'Name': ['Alice', 'Bob', 'Charlie', 'David'],
            'Age': [25, 30, 35, 40],
            'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
        }
        
        df = pd.DataFrame(data)
        print(df)
        
          Name  Age         City
	0    Alice   25     New York
	1      Bob   30  Los Angeles
	2  Charlie   35      Chicago
	3    David   40      Houston
  • 특징
    • 각 열(Column)은 고유한 Series로 간주된다.
    • 행과 열에는 각각의 인덱스와 컬럼 라벨이 있어 데이터를 쉽게 선택할 수 있다.
    • 판다스가 자동으로 인덱스를 생성.

2-4. Series와 DataFrame의 차이점

  • Series는 1차원 데이터 구조로, 데이터에 고유한 인덱스를 부여하여 데이터에 접근할 수 있다.
  • DataFrame은 2차원 데이터 구조로, 여러 개의 Series가 모여 테이블을 이루며, 행과 열 모두 인덱스를 통해 접근할 수 있다.

3. DataFrame 기본 연산

3-1. DataFrame에서 데이터 선택 (인덱싱 및 슬라이싱)

import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40]
}

df = pd.DataFrame(data)


	Name	Age
0	Alice	25
1	Bob		30
2	Charlie	35
3	David	40
  • 인덱스를 지정하지 않으면 → loc와 iloc가 같은 결과를 냄
print(df.iloc[1])
print(df.loc[1])

Name              Bob
Age                30
  • 인덱스를 지정하면 → loc는 인덱스(라벨), iloc는 행 번호(위치)를 사용하므로 차이가 분명.
import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40]
}

# 인덱스 직접 지정
df = pd.DataFrame(data, index=['A', 'B', 'C', 'D'])

print(df)

      Name  Age
A    Alice   25
B      Bob   30
C  Charlie   35
D    David   40

print(df.loc['B'])

Name    Bob
Age      30
Name: B, dtype: object

print(df.iloc[1])

Name    Bob
Age      30
Name: B, dtype: object

print(df.loc[1]) 

KeyError: 1

왜냐하면 인덱스가 1이 아니라 A, B, C, D이기 때문.

3-2. 행과 열 추가


import pandas as pd

data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35]
}

df = pd.DataFrame(data, index=['A', 'B', 'C'])

print(df)

      Name  Age
A    Alice   25
B      Bob   30
C  Charlie   35

df['Country'] = ['Seoul', 'Busan', 'Incheon']

print(df)


      Name  Age   Country
A    Alice   25    Seoul
B      Bob   30    Busan
C  Charlie   35  Incheon
  • "Country"라는 열이 없으므로 새로운 열이 생성.
  • 리스트의 값이 각 행에 순서대로 들어감.

3-3. 행과 열 삭제

  • 열 삭제 : DataFrame에서 열을 삭제하려면 drop() 메서드를 사용하며, axis=1을 설정한다.
      Name  Age   Country
A    Alice   25    Seoul
B      Bob   30    Busan
C  Charlie   35  Incheon

일 때

    # 'Country' 열 삭제
    df = df.drop('Country', axis=1)
    print(df)
    
      Name  Age
A    Alice   25
B      Bob   30
C  Charlie   35 
  • 행 삭제 : 특정 행을 삭제하려면 drop() 메서드를 사용하고, 인덱스를 전달한다.
      Name  Age   Country
A    Alice   25    Seoul
B      Bob   30    Busan
C  Charlie   35  Incheon

    # 0번째 행 삭제
    df = df.drop('A')
    print(df)
    
      Name  Age  Country
B      Bob   30    Busan
C  Charlie   35  Incheon    

3-4. 기초적인 데이터 수정 및 조작

  • 데이터 수정 : 특정 값을 변경하려면 인덱스와 열을 지정하고 값을 할당한다.

      Name  Age   Country
A    Alice   25    Seoul
B      Bob   30    Busan
C  Charlie   35  Incheon

    # 'Age' 열의 값을 수정
    df.loc['A', 'Age'] = 31
    print(df)
    
A    Alice   31    Seoul
B      Bob   30    Busan
C  Charlie   35  Incheon
  • 데이터 타입 변경 : 데이터의 타입을 변경하려면 astype() 메서드를 사용한다.
    # 'Age' 열을 float 타입으로 변경
    df['Age'] = df['Age'].astype(float)
    print(df.dtypes)
    
Name           str
Age         float64
Country        str
dtype: object

3-5. 고급 인덱싱 및 데이터 선택

1. 조건부 인덱싱

  • 조건부 선택 : 특정 조건을 만족하는 데이터를 선택할 수 있다.
data = {
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35]
}

df = pd.DataFrame(data, index=['A', 'B', 'C'])

df_filtered = df[df['Age'] >= 30]
print(df_filtered)

      Name  Age  Country
B      Bob   30    Busan
C  Charlie   35  Incheon
        
  • 복합 조건을 이용한 선택 : 여러 조건을 결합하여 데이터를 필터링할 수 있다.
df_filtered = df[(df['Age'] >= 30) & (df['Country'] == 'Busan')]
print(df_filtered)
        
   Name  Age Country
B  Bob   30   Busan       

2. 다중 인덱스 (MultiIndex)

  • MultiIndex 설정 : 여러 개의 인덱스를 사용하여 데이터를 계층적으로 표현할 수 있다.
arrays = [
    ['Group1', 'Group1', 'Group2', 'Group2'],
    ['Subgroup1', 'Subgroup2', 'Subgroup1', 'Subgroup2']
]
index = pd.MultiIndex.from_arrays(arrays, names=('Group', 'Subgroup'))

data = {'Value': [10, 20, 30, 40]}
df_multi = pd.DataFrame(data, index=index)
print(df_multi)

                  Value
Group  Subgroup
Group1 Subgroup1     10
       Subgroup2     20
Group2 Subgroup1     30
       Subgroup2     40

반복되는 Group1, Group2는 보기 편하도록 첫 번째 행에만 표시됩니다.

  • MultiIndex 데이터 선택
# Group1의 데이터 선택
print(df_multi.loc['Group1'])

           Value
Subgroup
Subgroup1     10
Subgroup2     20

# Group2의 Subgroup1 행
df_multi.loc[('Group2', 'Subgroup1')]

Value    30
Name: (Group2, Subgroup1), dtype: int64

핵심은 하나의 행에 단일 인덱스 대신 (Group, Subgroup)이라는 계층적인 인덱스 조합을 붙인다는 것입니다.

4. 시간 시계열 데이터 처리

pandas는 날짜 및 시간 데이터를 처리하는 강력한 도구들을 제공한다. 시간 데이터를 다루기 위해 datetime 형식으로 변환한 후, 시계열 데이터 분석 및 시각화를 할 수 있다.

  • 날짜 형식으로 변환

    • 시계열 데이터를 처리하기 위해서는 날짜 정보를 datetime 형식으로 변환해야 한다. pd.to_datetime() 함수를 사용하여 문자열 형식의 날짜를 datetime 객체로 변환할 수 있다.

      # 날짜 데이터를 datetime 형식으로 변환
      import pandas as pd
      
      df = pd.DataFrame({
          'Month': ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
          'Sales': [200, 300, 400, 500, 450]
      })
      
      df['Date'] = pd.to_datetime(
          df['Month'] + ' 2026',
          format='%b %Y'
      )
      
      print(df)
      
      입력 문자열           읽는 규칙          내부 날짜 값       기본 출력
      'Jan 2026'   +   '%b %Y'       →    datetime      →  2026-01-01
      
        Month  Sales       Date
      0   Jan    200 2026-01-01
      1   Feb    300 2026-02-01
      2   Mar    400 2026-03-01
      3   Apr    500 2026-04-01
      4   May    450 2026-05-01
  • 시간별 데이터 집계

    • 시계열 데이터는 주기적으로 집계할 수 있다. 예를 들어, 월별, 일별, 연도별 데이터를 쉽게 집계할 수 있다.

      # 월별 데이터를 날짜로 변환 후 집계 예시
      df.set_index('Date', inplace=True)
      monthly_sales = df.resample('ME').sum()  # 'ME'은 월별 집계를 의미
      print(monthly_sales)
      
      
                 Month  Sales
      Date                   
      2024-01-31   Jan    200
      2024-02-29   Feb    300
      2024-03-31   Mar    400
      2024-04-30   Apr    500
      2024-05-31   May    450
profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글