카테고리 없음

[시나공 AICE Associate] Chapter 4 : 기초 데이터 다루기

notmandarin 2025. 1. 28. 23:02
  • 관련도 없는 비전공자가 이 책을 바로 보기엔 빡셀 수 있다고 생각됨.
  • 왜냐? np.arange(100,300253) 이런 거 모르니까..

 

Section 1. 필요 데이터 선택하기

칼럼명으로 데이터 선택하기

flight[['colum1']] : 칼럼명으로 데이터 선택하기

flight[['colum1','column2','column3']] : 여러 칼럼명으로 데이터 선택하기

 

행 범위 지정해 데이터 선택하기 (slicing) : flight[15:21]  : 15~21행까지 가져오기

 

loc & iloc

loc(location) ilooc(integer location)

DF의 행이나 열에 ‘레이블(이름)’으로 접근 DF의 행이나 열에 인덱스 ‘값’으로 접근
인덱스 및 칼럼명을 통해 지정하는 방법 인덱스를 활용해 지정하는 방법
설정한 인덱스 그대로 사용 0 based index로 사용
flight.loc[[102, 202, 302]]  

 

loc를 사용하여 행과 열의 범위 지정하기

flight.loc[[102, 202, 302], ['airline', 'flight', 'source_city', 'price']] | flight.iloc[[2, 102, 202]]

 

iloc를 사용하여 행과 열의 범위 지정하기

flight.iloc[[2, 102], [1,8]] 

 

조건으로 데이터 선택하기 : Boolean 연산을 통해 원하는 데이터만 추출 가능

  • 조건 : price 가 12000 초과, airline이 Air_india 인 항목만 추출
price = flight['price']>12000 #진짜 boolean 연산
india = flight['airline'] == 'Air_India' # 진짜 boolean 연산

extracted_flight = flight[price&india].head()

 

 

 

 

Section 2. 필요 데이터 변경하기

데이터 추가하기

  • 기존 칼럼으로 새로운 칼럼 만들기⇒ 이렇게 하면 마지막에 추가됨
    • flight['price3'] = flight['price']+flight['price2']
  • 원하는 위치에 칼럼 만드는 법
    • loc : 위치
    • column : 칼럼 이름
    • vlaue : 뭐가 들어갈지
    • allow_duplicates : 중복 열 삽입 허용 여부
  • df.insert(loc, colum, value, allow_duplicates=False)

 

데이터 삭제하기 ⇒ drop

  • axis = 1 : 열 라벨로 데이터 삭제 df.drop('price3',axis=1)
  • axis = 0 : 행 라벨로 데이터 삭제 df.drop('index=0',axis=1)
  • 원본 데이터에서 영구적으로 삭제
  • df.drop('index=0',axis=1, inplace = True)

칼럼명 변경하기 ⇒ rename

df=df.rename(columns = {"airline" : 'airline_name'})

 

데이터프레임 정렬하기 ⇒ sort_values(by = '칼럼명', ascending=False)

  • 문자열도 정렬 가능

 

Section 3. 데이터 프레임 변형하기

- 예시 데이터

1. groupby

동일한 값을 갖는 행들끼리 그룹으로 묶은 후, 그룹별로 집계(합계, 평균 등)나 연산을 수행할 수 있게 해주는 기능

  • 주요 단계: Split → Apply → CombineSplit 특정 열(또는 여러 열)의 값 기준으로 그룹화
    Apply 집계 함수(합계, 평균 등) 또는 다른 연산(함수 적용)
    Combine 결과를 합쳐서(merge) 새 Series 또는 DataFrame 형태로 반환

(1) 기본 사용법 df.groupby 소괄호.대괄호.연산함수

df.groupby('기준열').연산함수()
df.groupby('기준열')['특정열'].연산함수()
df.groupby(['열1', '열2'])['특정열'].연산함수()
  • 연산함수 : mean(), sum(), count(), max(), min(), std(), var() 등
mean_scores = df.groupby('이름')['점수'].mean()
print(mean_scores)
이름
김철수    82.5
박영희    95.0
이영수    85.0
Name: 점수, dtype: float64

 

(2) 집계 함수(aggregation) 활용하기 df.groupby 괄호.대괄호.agg( ['연산함수1','연삼함수2'])

한 번에 여러 통계량을 계산할 때 유용

# '이름'별 여러 집계 값을 한 번에 뽑고 싶을 때
df.groupby('이름')['점수'].agg(['mean', 'sum', 'count'])
        mean  sum  count
이름                     
김철수    82.5  165      2
박영희    95.0  190      2
이영수    85.0  170      2

 

(2) -1. 사용자 정의 함수 적용

  • agg에 람다나 사용자 정의 함수를 넣어 그룹별로 원하는 연산을 적용 가능
# 각각 **평균**, **합계**, **(최댓값 - 최솟값)** 을 그룹별로 계산
def range_func(x): return x.max() - x.min() df.groupby('이름')['점수'].agg(['mean', 'sum', range_func])

 

(2) - 2. 서로 다른 열에 서로 다른 함수 적용하기

  • 딕셔너리 형태로 열과 함수를 매핑하면, 열마다 다른 함수를 적용 가능
  • df.groupby('이름').agg({ '점수': ['mean', 'sum'], '과목': 'count' })

 

(2) - 3. 그룹화 결과(인덱스) 다루기 reset_index

  • groupby로 반환되는 결과는 보통 인덱스가 그룹화 기준
  • 결과를 일반 열로 복원하고 싶다면 .reset_index()를 사용
grouped = df.groupby('이름')['점수']agg(['mean', 'max', 'min']) grouped = grouped.reset_index()
  • 이제 grouped는 '이름'과 '점수' 열을 갖는 일반적인 DataFrame 형태가 됨.
  •  적용 전
        mean  max  min
이름                  
김철수    82.5   85   80
박영희    95.0  100   90
이영수    85.0   95   75
  • 적용 후
이름 mean max min 0 김철수 82.5 85 80 1 박영희 95.0 100 90 2 이영수 85.0 95 75

 

2. pivot_table() vs pivot()

둘 다 데이터를 재구성하는 데 사용되지만, 주요 차이점이 있다.

✅ pivot()

  • 데이터프레임을 재구성하여 인덱스, 컬럼, 값의 위치를 조정합니다.
  • 하나의 값만 사용할 수 있습니다 (values 인자 필수).
  • 중복된 행이 있으면 ValueError가 발생합니다.

🔹 사용 예시

import pandas as pd

data = {'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
        'City': ['Seoul', 'Busan', 'Seoul', 'Busan'],
        'Sales': [200, 150, 300, 250]}

df = pd.DataFrame(data)

pivot_df = df.pivot(index='Date', columns='City', values='Sales')
print(pivot_df)

🔹 결과

City        Busan  Seoul
Date
2023-01-01    150    200
2023-01-02    250    300

➡️ pivot()을 사용하면 Date를 인덱스로, City를 컬럼으로, Sales를 값으로 하는 새로운 데이터프레임이 생성됨.


✅ pivot_table()

  • 여러 값이 있는 경우에도 사용할 수 있음 (aggfunc 사용 가능)
  • pivot()과 달리 그룹화를 지원하며, 중복된 값이 있어도 aggfunc를 통해 처리 가능
  • 기본적으로 mean을 사용하지만, sum, count 등 다양한 aggfunc 적용 가능

🔹 사용 예시

pivot_table_df = df.pivot_table(index='Date', columns='City', values='Sales', aggfunc='sum')
print(pivot_table_df)

🔹 결과 (동일)

City        Busan  Seoul
Date
2023-01-01    150    200
2023-01-02    250    300

➡️ pivot_table()을 사용하면 여러 값이 있어도 sum, mean 등의 집계 함수를 적용할 수 있습니다.


3. stack() vs unstack()

  • stack(): 컬럼을 행 인덱스로 변환
  • unstack(): 행 인덱스를 컬럼으로 변환

✅ stack()

  • 열(컬럼)을 행 인덱스로 변환하여 데이터의 차원을 줄입니다.
stacked = pivot_df.stack()
print(stacked)

🔹 결과

Date        City
2023-01-01  Busan    150
            Seoul    200
2023-01-02  Busan    250
            Seoul    300
dtype: int64

➡️ City 컬럼이 행으로 이동하여 MultiIndex 형태가 됩니다.


✅ unstack()

  • 인덱스를 다시 열로 변환하여 원래 데이터 형태로 되돌립니다.
unstacked = stacked.unstack()
print(unstacked)

🔹 결과

City        Busan  Seoul
Date
2023-01-01    150    200
2023-01-02    250    300

➡️ 다시 원래대로 컬럼을 City로 복구했습니다.


💡 pivot_table()은 pivot()보다 유연하고, stack()과 unstack()은 다차원 데이터를 변형할 때 유용합니다.