[시나공 AICE Associate] Chapter 4 : 기초 데이터 다루기
- 관련도 없는 비전공자가 이 책을 바로 보기엔 빡셀 수 있다고 생각됨.
- 왜냐? 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']
- 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()은 다차원 데이터를 변형할 때 유용합니다.