데이터 프레임을 행과 열 별로 정렬해보고, 집계해보자.
# 컬럼으로는 정렬 잘 안함
# 보통, 주로 행으로 정렬한다.
# 인덱스를 영화 타이틀로 바꾸기
movie_df.set_index('movie_title', inplace=True)
movie_df.head()
# 파일 읽어올 때 index_col='movie_title' 이렇게 해줘도 된다.
# movie_df = pd.read_csv('data/movie.csv', index_col='movie_title', encoding='UTF-8')
# 인덱스 이름으로 정렬
movie_df.sort_index() # 정렬 축 기본 - index(0)
movie_df.sort_index('index')
# 컬럼 이름으로 정렬하기
movie_df.sort_index('columns')
movie_df.sort_index(1)
# 인덱스 내림차순으로 정렬하기
movie_df.sort_index(ascending=False)
# 인덱스를 슬라이싱해서 보기
movie_df['Spectre':'John Carter']
# 슬라이싱 거꾸로 하면?
# movie_df['John Carter':'Spectre']
# 에러는 나지 않지만, 아무 것도 반환하지 않는다.
# 정렬한 다음에 A에서 B까지 슬라이싱
movie_df.sort_index()['A':'C'].tail()
# 이름으로 찾는데 왜 마지막 인덱스가 안 나올까
# 인덱스로 정렬을 하면 가능하다.
# 정렬하지 않은 상태에서 하면 에러 발생
# 부분으로 슬라이싱 가능. 단 정렬한 후에.
# 이름이지만 마지막 인덱스는 포함하지 않음.
movie_df.sort_index().loc['A':'B'] # loc 사용해야 한다.
# 정렬하지 않고 A:B를 하면?
# movie_df['A':'B'] # 에러 발생 # 밸류 에러
# 값으로 정렬
movie_df.sort_values('director_name') # 결측치 맨 뒤로
# 내림차순으로 정렬
movie_df.sort_values('director_name', ascending=False) # 마찬가지로 결측치는 맨 마지막으로
# SQL이랑 다르다
# 상영시간으로 2차 정렬
result = movie_df.sort_values(['duration','imdb_score'])[['duration','imdb_score']]
result.head(10)
# duration 오름차순 imdb_score 내림차순
result = movie_df.sort_values(['duration','imdb_score'], ascending=[True, False])[['duration','imdb_score']]
result.head(10)
# 오름차순이면 기본값이라 따로 넣어주지 않아도 됨.
# 다 True일 때만 생략할 수 있다.
# 원본을 변경하지 않는다.
함수 | 설명 |
---|---|
sum() | 합계 |
mean() | 평균 |
median() | 중위수 |
quantile() | 분위수 |
std() | 표준편차 |
var() | 분산 |
count() | 결측치를 제외한 원소 개수 |
min() | 최소값 |
max() | 최대값 |
idxmax() | 최대값 index |
idxmin() | 최소값 index |
unique() | 고유값 |
nunique() | 고유값의 개수 |
# 평균
flights.mean() # 문자열은 빼고 계산
# 결측치 빼고 계산
# 결측치 포함해서 계산하기
flights.mean(skipna=False)
# 합계 구하기
flights.sum() # 문자열은 다 합쳐준닼ㅋㅋㅋㅋ
# 시리즈로 해도 마찬가지.
# 문자열 타입 빼고 계산하기
flights.select_dtypes(exclude=[np.object])
# 문자열 타입을 뺀 컬럼들의 합계
flights.select_dtypes(exclude=[np.object]).sum()
# include 사용하기
flights.select_dtypes(include=[np.float64, np.int64]).sum()
# int64인지 int32인지 써줘야 함. int라고만 쓰면 기본값이 int32다.
# 그냥 float이고 int고 숫자는 다 쓰고 싶다
flights.select_dtypes(include=[np.number]).sum() # np.number - 모든 실수 타입
# 최대값
flights.max()
# 숫자는 제일 큰 숫자, 문자열은 유니코드 기준으로 가장 큰 값, 사전식 배열
# 문자열 순서(오름차순) : 특수문자 < 숫자 < 영문대문자 < 영문소문자 < 한글(외국어) - 유니코드(unicode) 순서
aggregate(func, axis=0, \*args, \*\*kwargs)
또는 agg(func, axis=0, \*args, \*\*kwargs)
# describe의 사용자 정의 버전같은 느낌
flights.describe()
# 이거를 내 맘대로 골라서 하는게 어그리게이트
# 평균
flights.mean()
# agg
flights.agg('mean') # 위와 같은 결과가 나옴.
# 일은 mean 함수가 함. agg는 시킬 뿐
# 이렇게 하나만 구할거면 mean 쓰는게 낫다
# 두 가지 이상 구할 때
flights.min(), flights.max()
# agg
flights.agg(['min','max'])
# 집계는 한 번에 하나밖에 못하는데
# 그 집계 결과를 모아서 보여준다.
flights.aggregate(['min', 'max'])
# 결과는 같음.
# 그냥 agg 사용하자
# 행과 열 바꾸기
flights.agg(['min','max']).T
# 딕셔너리로 지정하기
dic = {
'DEP_DELAY':'sum',
'AIR_TIME':['min', 'max']
}
flights.agg(dic)
# agg에서 특정 컬럼만 보고싶을 때
flights.agg(['sum','max'])
flights[['DEP_DELAY','AIR_TIME']].agg(['sum','max','min','mean','median'])
# 합계만 구하는 게 아니라 두 개 이상을 구할 때 사용.
감사합니다!