TIL

👀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 작성

회고

  너무.. 어려운 머신러닝.. 하루종일 붙잡고 있는중.. 최대한 내일까지 해서 주말에는 장고 강의 들어야겠다ㅠㅠ

댓글남기기