TIL/전처리, 시각화

데이터 전처리2

jojoon2786 2024. 7. 19. 20:49

3. 데이터 선택

● .iloc[로우, 컬럼] : 인덱스 번호로 선택하기

- 행번호(로우)와 열번호(컬럼)을 통해 특정 행과 열 데이터를 선택할 수 있음.

import pandas as pd

# 샘플 데이터프레임 생성
data = {
      'A': [1, 2, 3, 4, 5],
      'B': [10, 20, 30, 40, 50],
      'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2] # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
print(selected_data)

      A  B  C                         A  B  

0   1  10  100   

1   2  20  200                1   2  20  

2   3  30  300      -- >     2  3  30 

3   4  40  400                3   4  40   

4   5  50  500                4   5  50 

 

● .loc[로우,컬럼] : 이름으로 선택하기

- 인덱스가 번호가 아니고 특정 문자일 경우

import pandas as pd

# 샘플 데이터프레임 생성
data = {
      'A': [1, 2, 3, 4, 5],
      'B': [10, 20, 30, 40, 50],
      'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])

# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B'] # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
print(selected_data)

 

파이썬 슬라이싱과 다르게, loc에서는 end index를 포함하여 가져옴.

 

데이터 프레임 슬라이싱

data[  ['컬럼명1', '컬럼명2', '컬럼명3']  ]

리스트로 컬럼명을 묶어서 사용 가능, 컬럼명 순서를 바꿀 수도 있다.

 

● 두 개 이상의 셀을 선택할 경우

# 2개 컬럼명을 선택할 경우
data.loc[ '행이름' , ['컬럼명1' , '컬럼명2'] ]

# 2개 행이름을 선택할 경우
data.loc[ ['행이름1', '행이름2'] , '컬럼명1' ]

# 리스트 슬라이싱 : 을 활용해서 특정 범위를 지정하여 선택할 수 있습니다.
data.loc[ '행이름' , '컬럼명1' : ] # '컬럼명1' : ==> 컬럼명1부터 끝까지라는 의미

 

4. 불리언 인덱싱

  • 조건을 이용하여 데이터프레임에서 특정 조건을 만족하는 행을 선택하는 방법
  • 데이터를 필터링하거나 원하는 조건을 만족하는 행을 추출할 수 있음.
  • 주로 불리언 값을 가지는 조건식을 사용하여 데이터프레임을 인덱싱하는 방법

1) 단일 조건으로 필터링

# 'age' 열에서 30세 이상인 행 필터링
df[df['age'] >= 30]

 

2) 여러 조건으로 필터링

# 'age' 열에서 30세 이상이면서 'gender' 열이 'Male'인 행 필터링
df[(df['age'] >= 30) & (df['gender'] == 'Male')]

& 혹은 and 둘 다 사용 가능

df[(df['age'] >= 30) \

& (df['gender'] == 'Male')] 과 같이 줄바꿈 (\)을 이용해서 가독성을 높일 수도 있음.

 

3) 조건에 따른 특정 컬럼 필터링

# 'age' 열에서 30세 이상인 경우의 'name' 열만 선택
df.loc[df['age'] >= 30, 'name']

 

4) isin()을 활용한 필터링

# 'gender' 열에서 'Male' 또는 'Female'인 행 필터링
df[df['gender'].isin(['Male', 'Female'])]

isin() 메소드 - 시리즈나 데이터프레임의 값들 중에서 특정 값이나 리스트 안에 포함된 값들을 찾아내는 메소드

 

5. 데이터 병합

1) concat 함수

데이터를 위아래 / 좌우로 연결할 수 있음.

import pandas as pd

# 두 개의 데이터프레임 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})

# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0)

# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)

print("위아래 연결 결과:\n", result_vertical)
print("\n좌우 연결 결과:\n", result_horizontal)

위아래로 연결 --> axis = 0

좌우로 연결 --> axis = 1

 

ignore_index : 기본값은 False, 연결된 결과 데이터프레임의 인덱스를 유지함. True로 설정하면  기존 인덱스를 무시하고 새롭게 인덱스 설정

reset_index : 위와 같음.

df = pd.concat([df1,df2,df3], axis = 1).reset_index(drop = True)

이와 같이 사용

 

2) merge 함수

sql 의 join이라고 생각하면 편함.

주로 두 개 이상의 데이터프레임에서 공통된 열이나 인덱스를 기준으로 데이터를 병합할 때 사용

import pandas as pd

# 두 개의 데이터프레임 생성
left_df = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
right_df = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

# 'key' 열을 기준으로 두 데이터프레임 병합
merged_df = pd.merge(left_df, right_df, on='key', how='inner')

print(merged_df)

how에는 inner, outer, left, right가 들어갈 수 있음.

on 은 기준 컬럼

 

 

6. 데이터 집계

1) Group by()

데이터프레임을 그룹화하고, 그룹 단위로 데이터를 분할(split), 적용(apply), 결합(combine)하는 기능을 제공.

데이터프레임을 특정 기준에 따라 그룹으로 나누어 집계, 변환, 필터링 등을 할 수 있다.

 

import pandas as pd

# 샘플 데이터프레임 생성
data = { 'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
             'Value': [1, 2, 3, 4, 5, 6] }
df = pd.DataFrame(data)

# 'Category' 열을 기준으로 그룹화하여 'Value'의 연산 수행
grouped = df.groupby('Category').mean()

grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()

# 수치형 데이터의 경우에 연산이 가능

category 컬럼을 기준으로 그룹화 한 것

grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()

기준 열은 여러 개 선택 가능

복수의 열을 기준으로 그룹화하여 데이터프레임을 조작하는 경우, 복수의 열을 리스트로 전달한다.

 

 

grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})

agg() 함수를 사용하여 여러 열에 대해 다양한 집계 함수를 적용할 수 있음.

 

2) Pivot table

데이터프레임에서 피벗 테이블을 생성하는 데 사용됨.

import pandas as pd

# 샘플 데이터프레임 생성
data = { 'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
             'Category': ['A', 'B', 'A', 'B', 'A'],
             'Value': [10, 20, 30, 40, 50] }
df = pd.DataFrame(data)

# 피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')
print(pivot)

aggfunc으로 원하는 집계 함수 사용 가능

 

pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})

집계 함수를 다르게 적용할 수도 있음.

 

7. 데이터 정렬하기

sort_values() 함수를 사용하여 정렬할 수 있다.

import pandas as pd

# 샘플 데이터프레임 생성
data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
             'Age': [25, 22, 30, 18, 27],
             'Score': [85, 90, 75, 80, 95] }
df = pd.DataFrame(data)

# 정렬
sorted_by_score = df.sort_values('Score') # 'Score' 열을 기준으로 오름차순 정렬
sorted_by_score = df.sort_values('Score',ascending=False) # 'Score' 열을 기준으로 내림차순 정렬
print(sorted_by_score)

기본 값은 오름차순 정렬이고, ascending = False를 사용하여 내림차순 정렬도 가능.

sorted_by_index = df.sort_index() # 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index(
ascending=False) # 인덱스를 기준으로 내림차순 정렬

인덱스를 기준으로 정렬할 수도 있다.

 

정렬값에 각각 오름차순, 내림차순을 부여할 수도 있음.