[TIL] 내일배움캠프 32일차_[Pandas] 데이터 변형하기
👀Today I Learn
데이터 정렬과 병합
1. 데이터 정렬
# 예시 데이터프레임 생성
data = {
'이름': ['철수', '영희', '민수', '지수'],
'나이': [25, 30, 22, 35],
'직업': ['학생', '회사원', '학생', '프리랜서']
}
df = pd.DataFrame(data)
sort_values()를 사용한 값(Value) 기준 정렬
-
특정 열의 값을 기준으로 데이터를 오름차순 또는 내림차순(
ascending=Fals
)으로 정렬 가능# '나이' 기준으로 오름차순 정렬 sorted_df = df.sort_values(by='나이') # '나이' 기준으로 내림차순 정렬 sorted_df_desc = df.sort_values(by='나이', ascending=False)
-
오름차순 정렬 결과 :
이름 나이 직업 2 민수 22 학생 0 철수 25 학생 1 영희 30 회사원 3 지수 35 프리랜서
sort_values() 를 사용한 여러 열 기준 정렬
-
여러 열을 기준으로 정렬. 우선순위에 따라 첫 번째 열부터 정렬
# '직업'을 기준으로, 같은 직업 내에서 '나이' 오름차순 정렬 sorted_df_multi = df.sort_values(by=['직업', '나이']) print(sorted_df_multi) # '이름'은 오름차순으로 '나이'는 내림차순으로 정렬 sorted_df_multi = df.sort_values(by=['나이', '이름'], ascending = [False, True])) print(sorted_df_multi)
sort_index() 를 사용한 인덱스 기준 정렬
-
인덱스를 기준으로 데이터를 정렬
# 인덱스 기준으로 정렬 sorted_index_df = df.sort_index() print(sorted_index_df) # 인덱스를 내림차순으로 정렬 sorted_index_df_desc = df.sort_index(ascending=False) print(sorted_index_df_desc)
2. 데이터 병합
# 예시 데이터프레임 생성
df1 = pd.DataFrame({
'이름': ['철수', '영희', '민수'],
'나이': [25, 30, 22]
})
df2 = pd.DataFrame({
'이름': ['철수', '영희', '지수'],
'직업': ['학생', '회사원', '프리랜서']
})
merge() 를 사용한 데이터프레임 병합
- SQL의 JOIN과 유사하게 두 데이터프레임을 공통 열을 기준으로 병합
-
inner join을 사용하기 때문에 공통 열이 없는 데이터는 삭제함
# '이름'을 기준으로 병합 merged_df = pd.merge(df1, df2, on='이름')
-
결과 :
이름 나이 직업 0 철수 25 학생 1 영희 30 회사원
다양한 merge() 방식
- 유일 값이 아닌 경우에 중복값이 많이 생길 수 있음
- 여러번 merge 할 수 있음
how = ''
inner
(기본값): 공통된 데이터만 병합.outer
: 공통되지 않은 데이터도 포함하여 병합, 없는 값은 NaN으로 채움.left
: 왼쪽 데이터프레임 기준으로 병합.-
right
: 오른쪽 데이터프레임 기준으로 병합.# outer join을 사용한 병합 merged_df_outer = pd.merge(df1, df2, on='이름', how='outer')
-
결과 :
이름 나이 직업 0 철수 25.0 학생 1 영희 30.0 회사원 2 민수 22.0 NaN 3 지수 NaN 프리랜서
concat() 을 사용한 데이터프레임 연결
-
행 또는 열 단위로 데이터프레임을 연결
# 행 단위로 데이터프레임 연결 concat_df = pd.concat([df1, df2], axis=0) print(concat_df)
-
결과 :
이름 나이 직업 0 철수 25.0 NaN 1 영희 30.0 NaN 2 민수 22.0 NaN 0 철수 NaN 학생 1 영희 NaN 회사원 2 지수 NaN 프리랜서
-
열 단위로 연결하고 싶다면
axis = 1
지정# 열 단위로 데이터프레임 연결 concat_df_axis1 = pd.concat([df1, df2], axis=1)
join() 을 사용항 데이터프레임 병합
-
인덱스를 기준으로 데이터 프레임을 병합할 때 사용
# 예시 데이터프레임 생성 df3 = pd.DataFrame({ '직업': ['학생', '회사원', '프리랜서'], '연봉': [2000, 3000, 4000] }, index=['철수', '영희', '지수']) # 인덱스를 기준으로 병합 joined_df = df1.set_index('이름').join(df3)
-
결과:
나이 직업 연봉 이름 철수 25 학생 2000.0 영희 30 회사원 3000.0 민수 22 NaN NaN
그룹화 및 집계, 피벗테이블
1. 데이터 그룹화 및 집계
# 예시 데이터프레임 생성
data = {
'이름': ['철수', '영희', '민수', '지수', '철수', '영희'],
'과목': ['수학', '수학', '과학', '과학', '영어', '영어'],
'점수': [90, 85, 95, 80, 75, 88]
}
df = pd.DataFrame(data)
groupby() 를 사용한 그룹화
- 특정 열을 기준으로 그룹화
-
활용할 수 있는 상태로만 만들어줌!
# '이름'을 기준으로 그룹화 grouped = df.groupby('이름')
집계함수 사용하기
-
그룹화한 데이터에 대해 다양한 집계 함수(
mean
,sum
,count
등)를 사용 가능# 각 학생의 평균 점수 계산 mean_scores = grouped['점수'].mean()
-
여러 집계 함수를 동시에 사용 가능
grouped['점수'].agg(['sum', 'mean'])
-
결과 :
sum mean 이름 민수 95 95.0 영희 173 86.5 철수 165 82.5 지수 80 80.0
여러 열을 기준으로 그룹화하기
-
여러 열을 기준으로 그룹화도 가능
grouped_multi = df.groupby(['이름', '과목'])['점수'].sum() print(grouped_multi)
-
결과:
이름 과목 민수 과학 95 영희 수학 85 영어 88 철수 수학 90 영어 75 지수 과학 80 Name: 점수, dtype: int64
2. 피벗테이블 사용하기
- 데이터를 요약하는 강력한 도구
- 엑셀의 피벗테이블과 유사하며, 특정 기준에 따라 데이터 재구조화 가능
`pivot_table()` 기본 사용법
-
데이터를 요약하고, 특정 기준에 따라 재구조화
# 피벗테이블 생성: '이름'을 인덱스로, '과목'을 컬럼으로 하여 점수의 평균(mean) 계산 pivot = pd.pivot_table(df, index='이름', columns='과목', values='점수', aggfunc='mean')
-
결과 :
과목 과학 수학 영어 이름 민수 95.0 NaN NaN 영희 NaN 85.0 88.0 철수 NaN 90.0 75.0 지수 80.0 NaN NaN
여러 집계 함수 사용하기
-
aggfunc
에 여러 집계함수를 지정한다면, 다양한 요약 통계를 얻을 수 있음# 점수의 합계와 평균을 계산하는 피벗테이블 생성 pivot_multi = pd.pivot_table(df, index='이름', columns='과목', values='점수', aggfunc=['sum', 'mean'])
-
결과:
sum mean 과목 과학 수학 영어 과학 수학 영어 이름 민수 95.0 NaN NaN 95.0 NaN NaN 영희 NaN 85.0 88.0 NaN 85.0 88.0 철수 NaN 90.0 75.0 NaN 90.0 75.0 지수 80.0 NaN NaN 80.0 NaN NaN
margins 옵션을 사용하여 전체 합계 추가하기
-
margins=True
옵션을 사용하면, 각 행과 열의 합계가 추가된 피벗테이블을 생성 가능# 각 이름별, 과목별 총합을 포함한 피벗테이블 생성 pivot_with_totals = pd.pivot_table(df, index='이름', columns='과목', values='점수', aggfunc='sum', margins=True)
-
결과 :
과목 과학 수학 영어 All 이름 민수 95.0 NaN NaN 95.0 영희 NaN 85.0 88.0 173.0 철수 NaN 90.0 75.0 165.0 지수 80.0 NaN NaN 80.0 All 175.0 175.0 163.0 513.0
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 35-37
- SQL 코드카타 43-44
- 백준 코테 1문제
- 프로그래머스 코딩테스트 Day 24
- 머신러닝 과제 ~ing
- TIL 작성
회고
너무.. 어려운 머신러닝.. 하루종일 붙잡고 있는중.. 최대한 내일까지 해서 주말에는 장고 강의 들어야겠다ㅠㅠ
댓글남기기