rubus0304 님의 블로그

[데이터 전처리 3주차] 강의내용 (H.W_예정) 본문

강의/데이터전처리(Pandas)

[데이터 전처리 3주차] 강의내용 (H.W_예정)

rubus0304 2024. 10. 24. 01:28

https://teamsparta.notion.site/22ac9597e59346c08f5675bd2e11a329

 

데이터 전처리 & 시각화 | Notion

강의 목표

teamsparta.notion.site

 

 

Pandas 불러오기

import 명령어를 통해서 pandas 라이브러리를 불러오자

 

import pandas as pd 
# pandas 라이브러리를 불러올 것이며 이제부터 pandas를 pd라고 부를게 !

# 에러날 경우 !pip install pandas  #실행

 

 

데이터 불러오기/저장하기 

  • Tip 파일 경로 찾는 방법
  • Window
    1. 파일 탐색기(File Explorer)를 사용하여 파일 경로 찾기:
    2. 파일 탐색기를 열고 원하는 파일 또는 폴더를 찾은 후, 주소 표시줄(Address Bar)에 파일 경로가 표시됩니다. 이 경로를 복사하여 사용하거나, 마우스 오른쪽 버튼을 클릭하고 "속성(Properties)"을 선택하면 파일 또는 폴더의 속성 창에서 경로를 확인할 수 있습니다.
    3. 명령 프롬프트(Command Prompt)를 사용하여 파일 경로 찾기:
    4. 명령 프롬프트(cmd)를 열고, cd 명령어를 사용하여 원하는 디렉토리로 이동합니다. 그리고 pwd 명령어를 입력하면 현재 디렉토리의 경로를 확인할 수 있습니다.
  • Mac
    1. Finder를 사용하여 파일 경로 찾기:
    2. Finder를 열고, 원하는 파일 또는 폴더를 찾은 후, 상단의 경로 표시줄(Address Bar)에 파일 경로가 표시됩니다. 이 경로를 복사하여 사용하거나, 파일 또는 폴더를 선택한 후 마우스 오른쪽 버튼을 클릭하여 "정보 보기(Get Info)"를 선택하면 파일 또는 폴더의 경로를 확인할 수 있습니다.
    3. 터미널(Terminal)을 사용하여 파일 경로 찾기:
    4. 터미널을 열고, pwd 명령어를 입력하면 현재 작업 디렉토리의 경로를 확인할 수 있습니다.

 

[ 라이브러리 불러오기 ]

import pandas as pd   + shift + alt + Enter  (VS code)

import seaborn as sns

 

terminal 로 pandas 불러오기

Shift + Ctrl + ~  동시에 누르고  pip install pandas 설치 / pip install seaborn  동일하게 설치

안 돌아 간다?

커널 연결이 안 된 것.  - 위에 search 에  python recommended 된 거 클릭해서 매번 연결 시켜줘야함

 

 

[ 데이터 불러오기 ]

data = sns.load_dataset('tips') 

-> sns 에서 'tips'라는 데이터셋 가져왔음 

data 

로 확인!

 

[ 데이터 저장하기 ]

data.to_csv("tips_data.csv")

"파일명.확장자"

 

[ 데이터 불러오기 ] 

df = pd.read_csv("tips_data.csv")

df

 

[ 데이터 INDEX Null 값 제거하기 ]

 

1) 저장할 때 Null 값 제거하는 법

index null 값 제거하기 위해 아래처럼 index = False 추가해서 저장할 수 있음!  (** read 구문에 넣는 것 아님!  data.to_csv 에서 추가해서 저장 (False 꼭 대문자 주의!! 파이썬 라이브러리에선 저장되어있기 때문에 똑같이 써야함 ) 

 

data.to_csv("tips_data.csv") , index=False )     하고 다시 불러오기

index null 제거

 

2) 불러올 때 Null 값 제거하는 법

df = pd.read_csv("tips_data.csv", index_col=0)

df

 

 

[ 파일경로 지정해서 저장하기 ]   / 

df.to_csv("temp/tips_data.csv", index=False)

df =  이 아니고  df. 으로 바로 시작!

 

 

[엑셀형식으로 저장하기]  - 확장자 변경

df.to_excel("temp/tips.data.xlsx", index=False)

 

** ModuleNotFundError  떴다..! 인터넷 서치를 해보니 비슷한 사례 있었음.. 에러메세지 내 필요모듈 문구대로 터미널에서   openpyxl 설치해봄

오오 혼자서 해결+_+!  엥 근데 열어보니 이상하케 나옴+_+....!!!! 이건 여쭤봐야게따

 

엑셀은 자기들 프로그램 쓰게하려고 다른 프로그램에서 깨져보이게 하는 경우가 종종 있다고함. 

컴퓨터에 저장된 파일로 보면 되고, 혹시 엑셀이 컴터에 안 깔려 있어서 편집이 안 되는 경우, 

파이썬에서  csv 파일에서 편집하고 저장하거나,  전체를 변경해야할 경우,  코드 짜서 다시 csv 파일로 이름 바꿔서 저장하면 됨!!  그냥 csv 파일 이름 그대로 하면 덮어씌워져버림 -ㅁ- ㄷㄷㄷ

 

인덱스(Index)

 

[인덱스 넣기]   

 

df = pd.DataFram({

       'a' : [1,2,3],

       'b' : ['a', 'b', 'c']

}, index = ['idx1', 'idx2', 'idx3'])

df

 

 

df.loc [ 'idx2' ]  - 2번째 행에 대한 정보 가져와라  (근데 열이 행으로 바뀌어서 가져옴)

 

df.sort _index( )  -  인덱스 번호대로 정렬

 

df.set_index ('A')    ->  index 다시 설정  (A라는 컬럼으로 index 쓰겠다)

 

df.index   ->  index 값 이랑 형식 확인

 

 

df.index = [ '1', '2', '3' ]   ->  index 다시 변경하기  ['ㄱ','ㄴ','ㄷ'] 도 가능..!!

df

 

df.reset_index() -> index를 기존값으로 해주는 것.  0,1,2 기본으로 바뀜

sort( ) 함수로 정렬 시키면 보통 인덱스가 뒤죽박죽 되버리는데, 그 순서로 다시 정렬되어 맨 왼쪽에 index 추가.

 

추가적으로, 

 .sort_idex 혹은 .sort_value ('컬럼') 쓰면 해당 '컬럼' 이 row index 로 내려가버림..무조건.

이런 경우에도 reset_index( )  하면 다시 다른 컬럼들과 동일하게 올라옴.

 

 

df.reset_index(drop = True)  :  기존에 있던 인덱스 없어짐

 

 

컬럼 

** 딕셔너리에서는  = 하면 에러남. 'name' : ['리스트값1',....]  해야함 

data=  {

      'name' : ['Alice', 'Bob', 'Charlie' ],

       'age' : ['25, '30', '35'],

       'gender' : ['female', 'male', 'male']

       }

df = pd.DataFrame(data)

df

 

df['age']   -> 컬럼 한 개 가져오기

 

df.columns   -> 컬럼들 및 type 가져오기

 

df.columns = ['이름', '나이', '성별']     -> 컬럼 이름 바꾸기

 

 rename 사용하여 컬럼 이름 바꾸기  (처음엔 df = 로 지정해줘야함) 

df = df.rename(columns={'이름' : 'name'})  

df

 

여러개 컬럼이름 바꾸기 

df.rename(columns={'나이' : 'age', '성별' : '남/여'} )

 

 

컬럼 및 안에 값 추가하기

 

df [ '스포츠'] = '축구'

df

 

 컬럼 삭제하기

del df [ '스포츠'] 

df

 

 

데이터 확인하기

 

df = pd.read_csv("temp/tips_data.csv")

df

 

 

☑️ .head()

  • 데이터를 N개 행까지 보여줍니다.

data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌

 

df.head ( ) -> 기본적으로 5개 행 가져옴  (요약, 헤드라인 메소드)

 

df.head(3)   -> 만약에 괄호에 숫자넣으면  그 만큼 출력

 

 

☑️ .Info()

  • 데이터의 정보를 파악합니다. (인덱스, 컬럼명, 컬럼의 데이터 개수, 데이터 타입)

data.info() 
# null 값을 확인할때도 활용

 

 

df.info( ) type, null값 여부 등

 

 

☑️ .describe()

  • 데이터의 기초통계량을 확인합니다. (개수, 평균, 표준편차, 사분위, 중앙값)

data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.

 

df.describe( )  ->  몇 개 있는지 (count), 최대, 최소값 등  ** float int (숫자 타입 컬럼값들만 통계 보여줌)

 

 

 

결측치 확인

☑️ 데이터를 불러온 다음에는 꼭 확인을 해주셔야해요!

  • 데이터의 결측치(null)가 있는지?
    • 결측치 제거하는 방법  (Null 값)

# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !

# 결측치 제거 : dropna()
df.dropna()

 

  • 데이터 중복 데이터는 없는지?
    • 중복 데이터 제거하는 방법

# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])

# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])

 

 

  • 데이터 이상치는 없는지?
    • 이상치 처리하는 방법# IQR (Interquartile Range) 방법 찾아보기
      # 참고 : https://www.scribbr.com/statistics/interquartile-range/

      # IQR 계산
      Q1 = df['컬럼1'].quantile(0.25)
      Q3 = df['컬럼1'].quantile(0.75)
      IQR = Q3 - Q1

      # 이상치 기준 설정
      lower_bound = Q1 - 1.5 * IQR
      upper_bound = Q3 + 1.5 * IQR

      # 이상치 제거
      df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

 

isna ( )

 

 

df=pd.DataFrame ({

     'A' : [1,2,3,4],

     'B' : [5,6,7,None]

})

df

 

df.info()  -> null 값이 아닌 값이 몇 개인지  (B에 null 1개 있으므로, B는 3개 정상)

 

 

df.isna ( )   ->  True 면 Null / False 면 정상

 

df['B'].isna( )  -> B 컬럼만 따로 봤을 떄 

 

df [ df['B'].isna ( ) ]   ->  Tru/False 값 통해서 일종의 조건식으로 데이터프레임 안에서 불러올 수 있음 /

 

df [  ]  대괄호 안에 조건을 넣어주면, 조건이 True 인 행 전체를 불러오게됨 

 

 

ex) B컬럼에 Null 값을 한 개 더 추가했을 때

 

 

 

 

데이터 타입

 

☑️ astype를 사용한 데이터 타입 변경

 

데이터 타입을 알맞게 들어가있는지? ex) 날짜, 숫자

 

# 데이터 타입 변경을 원한다면 ! 
df['column_name'].astype(int)
df['column_name'].astype(float)
df['column_name'].astype(str)
df['column_name'].astype(bool)
df['column_name'].astype('category')
df['column_name'].astype('datetime64[ns]')
df['column_name'].astype(complex)
df['column_name'].astype(object)

 

.astype( ) 는 Pandas 데이터프레임의 열의 데이터 타입을 변경하는 데 사용됩니다. 이를 사용하여 열의 데이터 타입을 원하는 형식으로 변환할 수 있습니다.

 

DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)

 

  • DataFrame['column_name']: 열을 선택하는 방식으로 열의 데이터 타입을 변경하고자 하는 열을 지정합니다.
  • new_dtype: 변경하고자 하는 새로운 데이터 타입을 명시합니다. (예: 'int', 'float', 'str' 등)

 

  • 예시 1) int → float

import pandas as pd

# 예시 데이터프레임 생성
data = {'integer_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 정수형 열을 부동소수점으로 변환
df['integer_column'] = df['integer_column'].astype(float)
print(df.dtypes)  # 데이터프레임의 열 타입 확인

 

 

예시 2) int → str

 

import pandas as pd

# 예시 데이터프레임 생성
data = {'numeric_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 숫자열을 문자열로 변환
df['numeric_column'] = df['numeric_column'].astype(str)
print(df.dtypes)  # 데이터프레임의 열 타입 확인

 

(예시)

df = pd.read_csv("temp/tips_data.csv")
df

 

 

df['tip'].dtype    -> 컬럼 별 데이터 타입

 

cf. 데이터 타입

 

int : 정수  ( 1 )

float : 실수 ( 1.0 ) (int와 float 혼합하여 계산시, 결과값은 항상 float  단위가 더 크므로)

str :  텍스트 타입  ( '1' )

list  : 리스트 타입 ( [1] ) 

 

 

데이터 타입 바꾸기  df [ '컬럼' ] .astype(변경할 타입)

df [ 'total_bill' ] = df [ 'total_bill'].astype(str)

 

total_bill 데이터 타입 float (실수) -> object (문자)

 

 

소숫점 때문에 문자형식에서는 바로 int (정수) 로 못 바꿈   ( str --x --> int  )

float (실수) 형식에선 int 로 변경가능!!

 str  --> float (숫자) -> int

 

 

데이터 선택

 

1) lioc, loc를 배워봅시다 !

    • **iloc**은 정수 기반의 인덱스를 사용하고, **loc**은 레이블 기반의 인덱스를 사용합니다

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

 

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

 

data.iloc[0,2]
#행과 열 번호를 통해 특정 데이터를 선택할 수 있음

 

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)

 

iloc [시작: 얼마나: 보폭] 

0부터 시작 5개까지, 몇 칸 튈건지

 

cf. df.iloc[0: :2]  가운데 어디까지 지정 생략하면 처음부터 끝까지

 

 

행과 열이 존재하는 경우  컴마로 구분하여 가져옴  df.iloc(행, 열)  몇 행, 몇 열 째 값 가져와

 

근데 여기서  열 값을 여러개 보고싶다 하면 df.ilo[0, 0:2]  행은 그대로 두고 열 값을 처음부터 2개까지해서 행도 그 열에 맞춘 값 같이 나옴

 

전체 데이터 출력

 

 

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

 

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

 

data.loc['행이름' , '컬럼명']

df.loc['b':, 'A']

b부터 끝까지 행, A 열
b부터 e까지 행, A부터 C까지 열

 

 

*** df.iloc[1:3, 0 ] 일 때, 파이썬 숫자니까 1부터 3이면  0,1,2 번째까지 출력!

     BUT, 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)

 

 

 

☑️ 1개의 컬럼 전체를 선택할 경우

 

리스트 슬라이싱을 활용해서 선택해봅시다.

 

data.loc[, '컬럼명']

#또는 데이터프레임['컬럼명'] 으로도 동일한 값을 선택할 수 있습니다.
data['컬럼명']

 

여러개의 컬럼을 선택할 경우에도 리스트를 활용해서 선택할 수 있습니다.

 

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

 

여러개 컬럼을 선택할때, 내가 원하는 순서대로 데이터를 선택할 수 있습니다.

 

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

 

 

☑️ 2개 이상의 셀을 선택할 경우

 

리스트 형태를 활용해서 데이터를 선택해봅시다.

 

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

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

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

 

순서 다르게도 가져올 수 있음

 

 

 

2) 조건에 따라 데이터를 선택하기 (Boolean Indexing)

 

☑️ 특정 조건을 만족하는 데이터를 선택할 경우 (Boolean Indexing)

  • Boolean Indexing이란?
    • 조건을 이용하여 데이터프레임에서 특정 조건을 만족하는 행을 선택하는 방법
    • 데이터를 필터링하거나 원하는 조건을 만족하는 행을 추출할 수 있음
    • 주로 불리언(Boolean) 값을 가지는 조건식을 사용하여 데이터프레임을 인덱싱하는 방법
      • 조건식에 따라 각 행이 True 또는 **False**로 평가되며 이를 바탕으로 데이터프레임을 필터링

 

예시

 

 

 

 

☑️ 실습해보기 : 특정 조건을 만족하는 데이터를 선택할 경우

 

비교 연산자를 활용해봅시다.

 

# 예를들어, data['컬럼명1']이 숫자(int)값인 경우
data['컬럼명1'] < 80

# 80보다 작으면 True 
# 80보다 크면 False 을 반환합니다.

 

조건을 통해 True/False 로 반환된 값을 활용해서 True에 해당하는 값만 불러올 수 있습니다.

 

condition = data['컬럼명1'] < 80
condition

 

여러개 조건을 활용해서 값을 불러올 수 있습니다.

 

# 조건1 and 조건2 ==>> 조건1,2 둘다 만족해야한다 True
## and 를 &로 대체해서 사용할 수 있음

condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50

condition = condition1 & condition2
data[conditon]



# 조건1 or 조건2 ==>> 조건1과 조건2 둘중 하나만 만족하면 True
## or 를 |로 대체해서 사용가능

condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50

condition = condition1 | condition2
data[conditon]

 

 

 

# ()로 구분해서 조건을 한번에 입력해도 동일하게 활용할 수 있습니다.
condition = (data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)
data[conditon]

# 이렇게도 가능합니다.
data[(data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)]

# 조건이 많아서 행이 길어질 경우, 줄바꿈을 통해 구분해주시면 훨씬 가독성이 올라갑니다.
condition = (data['컬럼명1'] < 80) \
& (data['컬럼명2'] >= 50)\
& (data['컬럼명3'] >= 10)
data[conditon]

 

 

 

 

3) 데이터를 추가해보기

 

☑️ 데이터 추가하기

 

데이터프레임에 컬럼을 추가해봅시다.

 

df = pd.DataFrame()

df['컬럼명'] = data


# df라는 데이터프레임에 '컬럼명'이라는 이름의 컬럼이 추가되고,해당 컬럼에 data라는 값이 추가된다.
# 이때, data값이 1개의 단일 값인 경우에는 전체 df라는 데이터프레임 행에 data 값이 전체 적용됨
# 즉, 
# 하나의 값인 경우 => 전체 모두 동일한 값 적용
# (리스트,시리즈)의 형태인 경우 => 각 순서에 맞게 컬럼 값에 적용됨

 

 

신규 컬럼 추가하기

 

df = pd.DataFrame()

# 컬럼 추가하기
df['EPL'] = 100
df['MLS'] = 60
df['NBA'] = 70
df

 


# 리스트 형태로 컬럼값 추가하기
df['KFC'] = [50, 10, 30]
#Tip. 행 수를 맞춰서 입력해줘야함


# 컬럼을 여러 조건 및 계산식을 통해 산출 값으로도 추가가 가능
df['ABC'] = (df['EPL'] + df['NBA']) * df['MLS'] * 2

 

 

 

 

 

데이터 병합

 

concat, join, merge 함수를 통해 2개 이상의 데이터를 병합해봅시다.

 

1) concat

 

☑️ 데이터를 위아래로 합쳐봅시다

  • concat()함수는 데이터프레임을 위아래로 혹은 좌우로 연결할 수 있어요 !
    • axis: 연결하고자 하는 축(방향)을 지정합니다. 기본값은 0으로, 위아래로 연결하는 경우에 해당합니다. 1로 설정하면 좌우로 연결합니다.
    • ignore_index: 기본값은 False이며, 연결된 결과 데이터프레임의 인덱스를 유지합니다. True로 설정하면 새로운 인덱스를 생성합니다. (True → 기존 인덱스를 무시하고 새롭게 인덱스를 설정)
  • 데이터 합치기 (예시)

 

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)

 

 

 

2) merge

 

☑️ 데이터를 좌우로 합쳐봅시다

  • SQL의 JOIN 연산과 유사한 방식으로 데이터프레임을 합칠 수 있습니다. 주로 두 개 이상의 데이터프레임에서 공통된 열이나 인덱스를 기준으로 데이터를 병합할 때 활용됩니다.
  • merge() 함수의 주요 매개변수는 다음과 같습니다:
    • left와 right: 병합할 데이터프레임 중 병합되는 기준이 되는 왼쪽(left)과 오른쪽(right) 데이터프레임입니다.
    • how: 병합 방법을 나타내는 매개변수로, 'inner', 'outer', 'left', 'right' 등의 옵션이 있습니다.
      • 'inner': 공통된 키(열)를 기준으로 교집합을 만듭니다.
      • 'outer': 공통된 키를 기준으로 합집합을 만듭니다.
      • 'left': 왼쪽 데이터프레임의 모든 행을 포함하고 오른쪽 데이터프레임은 공통된 키에 해당하는 행만 포함합니다.
      • 'right': 오른쪽 데이터프레임의 모든 행을 포함하고 왼쪽 데이터프레임은 공통된 키에 해당하는 행만 포함합니다.
    • on: 병합 기준이 되는 열 이름(혹은 열 이름의 리스트)을 지정합니다.
      • left_on과 right_on: 왼쪽 데이터프레임과 오른쪽 데이터프레임에서 병합할 열 이름이 다른 경우에 사용합니다.
    • 데이터 합치기 (예시)  

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)

 

 

 

데이터 집계 

 

1) Group by

 

☑️ Group by()

  • Group by 함수는 데이터프레임을 그룹화하고, 그룹 단위로 데이터를 분할(split), 적용(apply), 결합(combine)하는 기능을 제공합니다
  • 데이터프레임을 특정 기준에 따라 그룹으로 나누어 집계, 변환, 필터링 등을 할 수 있습니다.
    1. 그룹 생성: 기준 열(혹은 열들)을 지정하여 데이터프레임을 그룹으로 나눕니다.
    2. 그룹에 대한 연산 수행: 그룹 단위로 원하는 연산(평균, 합, 개수 등)을 수행합니다.
    3. 결과 결합: 각 그룹의 연산 결과를 하나의 데이터프레임으로 결합하여 새로운 데이터프레임을 생성합니다.
  • Group by 함수 사용하기

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()

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

 

 

  • 복수의 열을 기준으로 Group by 함수 사용하기

import pandas as pd

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

# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 'Value'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()

print(grouped_multiple)

 

  • 다양한 집계 함수 적용해보기

import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value1': [1, 2, 3, 4, 5, 6],
    'Value2': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)

# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 각 그룹별 'Value1'과 'Value2'의 평균, 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})

print(grouped_multiple)

 

복수의 열을 기준으로 그룹화하여 데이터프레임을 조작하는 경우, groupby() 함수에 복수의 열을 리스트로 전달하여 원하는 그룹화 기준을 지정하고, agg() 함수를 사용하여 여러 열에 대해 다양한 집계 함수를 적용할 수 있습니다.

 

 

 

2) Pivot Table

 

☑️ Pivot Table()

  • pivot_table() 함수는 데이터프레임에서 피벗 테이블을 생성하는 데 사용됩니다.# 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)

 

  • 여러 열을 기준으로 피벗 테이블 생성하기

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'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

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

print(pivot)

 

  • 집계 함수를 다르게 적용하여 피벗 테이블 생성하기

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'],
    'Value1': [10, 20, 30, 40, 50],
    'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균과 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})

print(pivot)

 

 

  • 시각화 하기 (맛보기)
    • Group by 나 Pivot Table 함수를 통해 원하는 형태로 데이터를 가공하고 시각화 할 수 있습니다.

import matplotlib.pyplot as plt

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'],
    'Value1': [10, 20, 30, 40, 50],
    'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc='mean')


# 피벗 테이블의 선 그래프 시각화
pivot.plot(kind='line')
plt.xlabel('Date')
plt.ylabel('Values')
plt.title('Pivot Table Visualization')
plt.legend(title='Category')
plt.show()

 

 

 

3) 데이터 정렬하기

☑️ 데이터 정렬하기

  • 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)

 

 

  • sort_index() 함수:
    • 인덱스를 기준으로 정렬시켜보자

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_index = df.sort_index() # 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index(ascending=False) # 인덱스를 기준으로 내림차순 정렬
print(sorted_by_index)

 

 

 

 

기타

 

데이터를 저장하고 불러오는 pickle에 대해 간단히 알아봅시다.

 

pickle 간단하게 알아보기

 

☑️ 데이터 정렬하기

  • pickle 활용하기
    • python 의 변수, 함수, 객체를 파일로 저장하고 불러올 수 있는 라이브러리
    • list, dictionary등을 파일 그대로 저장하면 용량이 매우 커지는데 pickle을 사용하면 binary형태로 저장되기 때문에 용량이 매우 작아진다.
    • 추가적으로 gzip을 이용하여 pickle로 저장된 데이터를 압축할 수 있음 → pandas에서는to_pickle()및read_pickle() 메서드를 통해 pickle을 사용할 수 있음
    • 머신러닝 모델 등을 저장하고 불러올때도 활용함
  • pickle 저장하기

import pandas as pd

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

# 데이터프레임을 pickle 파일로 저장
df.to_pickle('dataframe.pkl')  # 데이터프레임을 'dataframe.pkl' 파일로 저장

 

 

 

pickle 불러오기

 

import pandas as pd

# pickle 파일에서 데이터프레임 불러오기
loaded_df = pd.read_pickle('dataframe.pkl')  # 'dataframe.pkl' 파일에서 데이터프레임 불러오기
print(loaded_df)

 

 

 

HW. 2주차 숙제 해설

 

1) 문제 살펴보기

☑️ Seaborn 내장데이터 셋을 활용해서 데이터를 전처리 해봅시다 !

  • iris 데이터셋을 활용해서 전처리를 해보자

iris 데이터셋을 활용해서 전처리를 해보자

 

import seaborn as sns

# 데이터셋 불러오기
iris_data = sns.load_dataset('iris')

 

Q1. 'species' 열 값이 'setosa'인 데이터 선택하기

 

Q2. 10부터 20까지의 행과 1부터 3까지의 열 선택하기

 

 

tips 데이터셋을 활용해서 전처리를 해보자

 

import seaborn as sns

# 데이터셋 불러오기
tips_data = sns.load_dataset('tips')

 

Q1. total_bill이 30 이상인 데이터만 선택하기

 

Q2. 성별('sex')을 기준으로 데이터 그룹화하여 팁(tip)의 평균 계산

 

Q3. 'day'와 'time'을 기준으로 데이터 그룹화하여 전체 지불 금액(total_bill)의 합 계산

 

Q4. 'day' 열을 기준으로 각 요일별로 팁(tip)의 평균을 새로운 데이터프레임으로 만든 후, 이를 기존의 tips 데이터셋에 합쳐보자