rubus0304 님의 블로그
[데이터 전처리 3주차] 강의내용 (H.W_예정) 본문
https://teamsparta.notion.site/22ac9597e59346c08f5675bd2e11a329
Pandas 불러오기
import 명령어를 통해서 pandas 라이브러리를 불러오자
import pandas as pd
# pandas 라이브러리를 불러올 것이며 이제부터 pandas를 pd라고 부를게 !
# 에러날 경우 !pip install pandas #실행
데이터 불러오기/저장하기
- Tip 파일 경로 찾는 방법
- Window
- 파일 탐색기(File Explorer)를 사용하여 파일 경로 찾기:
- 파일 탐색기를 열고 원하는 파일 또는 폴더를 찾은 후, 주소 표시줄(Address Bar)에 파일 경로가 표시됩니다. 이 경로를 복사하여 사용하거나, 마우스 오른쪽 버튼을 클릭하고 "속성(Properties)"을 선택하면 파일 또는 폴더의 속성 창에서 경로를 확인할 수 있습니다.
- 명령 프롬프트(Command Prompt)를 사용하여 파일 경로 찾기:
- 명령 프롬프트(cmd)를 열고, cd 명령어를 사용하여 원하는 디렉토리로 이동합니다. 그리고 pwd 명령어를 입력하면 현재 디렉토리의 경로를 확인할 수 있습니다.
- Mac
- Finder를 사용하여 파일 경로 찾기:
- Finder를 열고, 원하는 파일 또는 폴더를 찾은 후, 상단의 경로 표시줄(Address Bar)에 파일 경로가 표시됩니다. 이 경로를 복사하여 사용하거나, 파일 또는 폴더를 선택한 후 마우스 오른쪽 버튼을 클릭하여 "정보 보기(Get Info)"를 선택하면 파일 또는 폴더의 경로를 확인할 수 있습니다.
- 터미널(Terminal)을 사용하여 파일 경로 찾기:
- 터미널을 열고, 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 ) 하고 다시 불러오기
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)]
- 이상치 처리하는 방법# IQR (Interquartile Range) 방법 찾아보기
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['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']
*** 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)하는 기능을 제공합니다
- 데이터프레임을 특정 기준에 따라 그룹으로 나누어 집계, 변환, 필터링 등을 할 수 있습니다.
- 그룹 생성: 기준 열(혹은 열들)을 지정하여 데이터프레임을 그룹으로 나눕니다.
- 그룹에 대한 연산 수행: 그룹 단위로 원하는 연산(평균, 합, 개수 등)을 수행합니다.
- 결과 결합: 각 그룹의 연산 결과를 하나의 데이터프레임으로 결합하여 새로운 데이터프레임을 생성합니다.
- 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 데이터셋에 합쳐보자
'강의 > 데이터전처리(Pandas)' 카테고리의 다른 글
[데이터 전처리] 홀로서기 (H.W_예정) (1) | 2024.10.24 |
---|---|
[데이터 전처리 4주차] 강의요약 (H.W_예정) (0) | 2024.10.24 |
[데이터 전처리 1-2주차] 강의요약 (3) | 2024.10.21 |