코딩하는 타코야끼

[Pandas] 3강_Pandas 정렬 집계 본문

[T.I.L] : Today I Learned/Pandas

[Pandas] 3강_Pandas 정렬 집계

가스오부시 2023. 4. 18. 20:28
728x90
반응형

1. 정렬


📍 index이름, column 이름을 기준으로 정렬

df = pd.read_csv('data/movie.csv', index_col = 'movie_title')
df

🌓  sort_index(axis, ascending=True)

  • axis
    • index 이름 기준 정렬(행) : 'index' 또는 0 (기본값)
    • column 이름 기준 정렬(열) : 'columns' 또는 1
  • ascending
    • 정렬방식
    • True(기본): 오름차순, False: 내림차순
  • inplace
    • 원본에 적용 여부
    • False(기본): 변경한 복사본 반환
    • True : 원본을 변경
# sort_index() -> index name 으로 정렬
df.sort_index() # (axis=0)
df.sort_index(ascending=False) # 내림차순 정렬 (defaul: 오름차순

# index 정렬 => 부분일치 slicing 이 가능.
# !!! **정렬후 loc indexer 를 사용하면 속도가 빠르다.** !!!!!
df.sort_index().loc['A':'B'] # A 로 시작하는 영화 ~ B로 시작하는 영화 앞까지.


📍 특정 컬럼(열)의 값을 기준으로 정렬

🌓  sort_values(by, ascending, inplace)

  • by
    • 정렬 기준 컬럼이름을 문자열로 지정
    • 여러 컬럼에 대해 정렬할 경우 리스트에 담아 전달
  • ascending
    • 정렬방식
    • True(기본): 오름차순, False: 내림차순
    • 여러 컬럼에 대해 정렬할 경우 정렬방식도 리스트에 담아 전달
  • inplace
    • 원본에 적용 여부
    • False(기본): 변경한 복사본 반환
    • True : 원본을 변경
  • 결측치는 방식과 상관없이 마지막에 나온다.
# 감독이름기준 정렬
df.sort_values('director_name')
df.sort_values('director_name', ascending =False) # 내림차순

# 상영시간 기준 정렬
# df.sort_values('duration')[['duration','imdb_score']].head(30)
df.sort_values(['duration', 'imdb_score'])[['duration','imdb_score']].head(30)
# df.sort_values(['duration', imdb_score]) 
#                          : duration으로 전체를 정렬. duration이 같은 값들끼리는 imbd_score로 정렬    
#                          : 정렬방식 - 셋다 오름차순(기본방식)

# ascending은 by의 컬럼 순서대로 지정한다. -> 내림차순이 하나라도 있으면 지정해 줘야 한다.
df.sort_values(['duration', 'imdb_score'], ascending=[False, True])[['duration','imdb_score']].head(30)
# duration은 False(내림사춘), imdb_score는 True (오름차순)
-----
# boollean indexing 후 결과 정렬 (dataframe을 처리후에 그 결과를 정렬)
result = df[df['duration'] >250].sort_values('duration') # 조회결과를 정렬해서 result에 대입
# values_counts()결과 정렬 => 값기준으로 내림차순 정렬해서 결과를 반환.
result = df['director_name'].value_counts()
result[result>10].sort_index() # 감독 이름순으로 정렬
result[result>10].sort_values() # 오름차순으로 정렬


2. flights.csv (항공기 운항 기록 데이터)


📍 Column 이름과 고유값 의미

  • MONTH : 비행 월
  • DAY : 비행 일
  • WEEKDAY : 비행 요일 - 1(월요일)~7(일요일)
  • AIRLINE : 항공사 코드
    • UA: United Air Lines Inc.
    • AA: American Airlines Inc.
    • US: US Airways Inc.
    • F9: Frontier Airlines Inc.
    • B6: JetBlue Airways
    • OO: Skywest Airlines Inc.
    • AS: Alaska Airlines Inc.
    • NK: Spirit Air Lines
    • WN: Southwest Airlines Co.
    • DL: Delta Air Lines Inc.
    • EV: Atlantic Southeast Airlines
    • HA: Hawaiian Airlines Inc.
    • MQ: American Eagle Airlines Inc.
    • VX: Virgin America
  • ORG_AIR : 출발공항
  • DEST_AIR : 도착공항
  • SCHED_DEP : 출발예정시각
  • DEP_DELAY : 출발지연시간(분)
  • AIR_TIME : 비행시간(분)
  • DIST : 비행거리(마일)
  • SCHED_ARR : 도착예정시각
  • ARR_DELAY : 도착지연시간(분)
  • DIVERTED : 회항여부(1: True, 0: False)
  • CANCELLED : 취소여부(1: True, 0: False)

📍 데이터 확인하는 과정

🌓 .shap - 크기 확인

flights = pd.read_csv('data/flights.csv')
flights.shape
>>>
(58492, 14)

🌓 .info( ) - 정보 확인

flights.info()

🌓  .isnull( ).sum( ) - 결측치 개수 확인

flights.isnull().sum()

🌓  .value_counts( ) - column별 index 개수 확인

flights['AIRLINE'].value_counts()

🌓  .unique( ) - 고유값들의 종류 확인

flights['AIRLINE'].unique()

🌓 .nunique( ) - 고유값들의 수 확인

flights['AIRLINE'].nunique() # 14개의 범주로 구성되어 있다.
>>>
14

3. 기술통계 메소드들을 이용한 데이터 집계


📍 주요 기술통계 메소드

🌓  메소드

  • DataFrame에 위의 기술 통계 메소드들을 적용할 경우 컬럼별로 계산한다.
  • sum(), mode(), max(), min(), unique(), nunique(), count()는 문자열에 적용가능하다.
    • idxmax(), idxmin() 는 문자열 컬럼에 사용할 수 없다. (문자열의 경우 넘파이의 argmax(), argmin() 함수를 사용한다.)

🌓  공통 매개변수

  • skipna=True(기본값)
    • 결측치(NA)를 포함해서 계산할지 여부 설정.
    • True가 기본값으로 결측치(NA)를 제외하고 처리한다.
    • 결측치 제외하지 않으려면 skipna=False로 설정하는데 결측치가 있으면 결과는 결측치가 된다.
  • axis
    • DataFrame에 적용할 때 계산방향을 설정
      • 0 또는 'index' (기본값): 컬럼 방향으로 집계
      • 1 또는 'columns': 행 방향으로 집계

📍 aggregate(func, axis=0, *args, **kwargs) 또는 agg(func, axis=0, *args, **kwargs)

  • DataFrame, Series의 메소드로 집계결과를 다양한 형태로 묶어서 볼 때 사용한다.
    • 사용자 정의 집계메소드를 사용할 때도 편리하다.

🌓  매개변수

  • func
    • 집계 함수 지정
      • 함수명/함수리스트 (문자열)
        • 판다스 제공 집계메소드들은 문자열로, 사용자정의 집계함수는 함수 객체로 전달
      • Dictionary : {'집계할컬럼' : 집계함수, ... }
        • 컬럼별로 다른 집계를 할 경우
  • axis
    • DataFrame에 적용할 때 0 방향으로 계산할 지 1 방향으로 계산할지 설정
      • 0 또는 'index' (기본값): 컬럼 방향으로 집계
      • 1 또는 'columns': 행 방향으로 집계
      • 키원드 인자값이 들어갈떄는 꼭! axis = 0 or 1 표시를 해준다.
  • args, **kwargs
    • 함수에 전달할 매개변수.
    • 집계함수는 첫번째 매개변수로 Series를 받는다. 그 이외의 매개변수가 있는 경우.
# 도착 지연시간 (ARR_DELAY): 최소값, 최대값
flights["ARR_DELAY"].min(), flights['ARR_DELAY'].max()
>>>
(-60.0, 1185.0)
flights["ARR_DELAY"].aggregate(['min', 'max'])
>>>
min     -60.0
max    1185.0
Name: ARR_DELAY, dtype: float64
# aggregate => agg 같은 똑같음.
flights["ARR_DELAY"].agg(['min', 'max']) 
>>>
min     -60.0
max    1185.0
Name: ARR_DELAY, dtype: float64
flights['ARR_DELAY'].agg('mean',skipna=False)
flights['ARR_DELAY'].mean(skipna=False) # 위에 명령어와 같다.
>>>
nan
# 컬럼별로 다른 통계량을 계산 -> {컬럼:통계함수}
flights.agg({
    "DEP_DELAY":'sum',
    "ARR_DELAY":['mean', 'std'],
})


4. Groupby

  • 특정 열을 기준으로 같은 값을 가지는 행끼리 묶어서 group화 한다.
  • ~~ 별 집계를 할 때 사용한다. (성별, 직급별, 등급별 ...)
    • Group으로 묶을 기준 열은 범주형타입(category)을 사용한다.

📍 구문

🌓   DF.groupby('그룹으로묶을기준컬럼') 

  • DataFrameGroupby 객체를 반환한다.
  • DataFrameGroupby 객체는 어떤 행끼리 묶여있는지 정보를 가진다. 이 객체의 집계함수를 사용하면 그룹별 집계를 할 수 있다.
    •  DataFrameGroupby객체['집계할 컬럼'].집계함수( ) 
  • groupby에 여러개의 컬럼을 기준으로 나눌 경우 리스트에 묶어서 전달한다.
  • 집계할 컬럼이 여러개인 경우 리스트로 묶어준다.

🌓 집계함수

  • 기술통계 함수들
  • agg()/aggregate()
    • 여러 다른 집계함수 호출시(여러 집계를 같이 볼경우)
    • 사용자정의 집계함수 호출시
    • 컬럼별로 다른 집계함수들을 호출할 경우
# 항공사별 출발지연시간과 도착지연시간의 평균 (집계할 대상 컬럼이 여러개인 경우)
flights.groupby('AIRLINE')[['DEP_DELAY','ARR_DELAY']].mean()

flights.groupby('AIRLINE')[['DEP_DELAY','ARR_DELAY']].agg(['min','max']) # multi index라 불린다 !


📍 복수열 기준 그룹핑

  • 두개 이상의 열을 그룹으로 묶을 수 있다.
  • groupby의 매개변수에 그룹으로 묶을 컬럼들의 이름을 리스트로 전달한다.
# 출발공항 / 항공사 별 출발 지연시간의 min/max
flights.groupby(['ORG_AIR','AIRLINE'])['DEP_DELAY'].agg(['min','max'])

# 월/항공사 별 출발지연시간과 도착지연시간의 평균 - group의 기준컬럼 - 여러개, 집계대상 여러개
flights.groupby(["MONTH","AIRLINE"])[["DEP_DELAY","ARR_DELAY"]].mean()


📍 Group 별 집계결과에서 특정 조건의 항목만 조회

  • Groupby 집계 후 boolean indexing 처리한다.
# 항공사별 취소건수
result = flights.groupby("AIRLINE")['CANCELLED'].sum()
result[result >= 100].sort_values()
>>>
AIRLINE
OO    142
EV    146
MQ    152
AA    154
Name: CANCELLED, dtype: int64

5. 사용자 정의 집계함수를 만들어 적용


📍 사용자 정의 집계 함수 정의

  • 매개변수
    1. Series 또는 DataFrame을 받을 매개변수(필수)
    2. 필요한 값을 받을 매개변수를 선언한다. (선택)

📍 agg( ) 를 사용해 사용자 정의 집계 함수 호출

  • DataFrame.agg(func=None, axis=0, *args, **kwargs)
    • axis : 사용자 정의 함수에 전달할 값들(Series)의 축 지정
  • Series.agg(func=None, axis=0, *args, **kwargs)
    • DataFrame의 agg와 매개변수 구조를 맞추기 위해 axis 지정한다. (kwargs를 이용해 매개변수 전달할 경우 axis는 생략해도 된다. - axis기본값 0을 그냥 쓰면 되므로. - keyword 인자 뒤에 position 인자는 안되서 *args로 값 전달시에는 axis를 지정해야 한다.)
  • DataFrameGroupBy.agg(func, *args, **kwargs) :
    • axis 지정안함.
    • 사용자 함수에 Series를 group 별로 전달한다.
  • SeriesGroupBy.agg(func=None, *args, **kwargs)
    • axis 지정안함
    • 사용자 함수에 Series를 group 별로 전달한다.
  • args, **kwargs는 사용자 정의 함수에 선언한 매개변수가 있을 경우 전달할 값을 전달한다.
    • 키워드 인자를 이용해 가변인자로 전달하는 것이 편하다.
반응형