sort_values 메서드는 값을 기준으로 레이블을 정렬하는 메서드입니다.
사용법
df.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
by: 정렬 기준이될 레이블입니다.
axis: {0 : index / 1: columns} 정렬할 레이블입니다. 0이면 행, 1이면 열을 기준으로 정렬합니다.
inplace: 원본을 대체할지 여부입니다. True일 경우 원본을 대체하게 됩니다.
kind: 알고리즘 모드 입니다. 모드는 총 4종으로 quicksort, mergesort, heapsort, stable이 있는데,
속도와 효율성의 차이를 갖습니다. 기본적으로 quicksort이며, 자세한건 numpy doc에서 확인 가능합니다.
na_position: {first / last} Na값의 위치입니다. 기본값은 last로 정렬시 맨 뒤에 위치합니다.
ignore_index: 인덱스의 무시 여부입니다. True일 경우 인덱스의 순서와 상관없이 0,1,2,... 로 정해집니다.
key: 이 인수를 통해 정렬방식으로 함수를 사용할 수 있습니다. lamba의 사용이 가능합니다.
먼저 np.NaN이 포함된 간단한 5x3짜리 데이터를 만들어보겠습니다.
na = np.nan
data = [[-3,'A',17],
[na,'D',31],
[ 7,'D',-8],
[15,'Z', 3],
[ 0, na,-7]]
col = ['col1','col2','col3']
row = ['row1','row2','row3','row4','row5']
df = pd.DataFrame(data = data, index = row, columns= col)
print(df)
정렬의 기준이 되는 by에는 레이블명이 되는 str이 올수도 있고, 레이블명들의 list가 올 수 있습니다.
list형태가 올 경우, 첫 값부터 정렬합니다.
axis인수를 사용하여 어떤축을 기준으로 정렬할지 설정이 가능합니다.
단, 문자와 숫자의 혼용시 오류가 발생합니다. ※ Na는 무시됩니다.
열 기준 col3으로 오름차순 정렬
문자와 숫자의 혼용으로 쓴다면 오류가 발생합니다.
ascending인수를 이용하여 오름차순과 내림차순을 설정할 수 있습니다.
기본값은 True로 오름차순입니다. 내림차순의 경우 False로 아래와 같습니다.
na_position인수를 이용하여 결측값의 위치를 지정할 수 있습니다.
결측값이 맨 뒤(기본값)
결측값을 맨 앞으로 할려면
first를 쓰면 된다.
ignore_index인수를 사용하여 인덱스를 미사용 할 수 있습니다. 어떤식으로 정렬 되더라도
인덱스는 0, 1, 2, 3, ... 순서로 표시됩니다.
key인수를 사용하여 정렬에 함수를 이용할 수 있습니다
inplace 인수를 사용해서 원본을 대체할지의 여부를 설정할 수 있습니다.
sort_index 메서드는 인덱스를 기준으로 레이블을 정렬하는 메서드입니다.
사용법
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
axis: {0 : index / 1: columns} 정렬할 레이블입니다. 0이면 행, 1이면 열을 기준으로 정렬합니다.
level: multi index의 경우 정렬을 진행할 level입니다.
ascending: 오름차순으로할지 여부 입니다. 기본은 True로 오름차순입니다.
inplace: 원본을 대체할지 여부입니다. True일 경우 원본을 대체하게 됩니다.
kind: 알고리즘 모드 입니다. 모드는 총 4종으로 quicksort, mergesort, heapsort, stable이 있는데,
속도와 효율성의 차이를 갖습니다. 기본적으로 quicksort이며, 자세한건 numpy doc에서 확인 가능합니다.
na_position: {first / last} Na값의 위치입니다. 기본값은 last로 정렬시 맨 뒤에 위치합니다.
sort_remaining: multi index의 경우 다른 레벨에 대해서도 정렬을할지 여부입니다. True로 할 경우
한 레벨에 대한 정렬이 완료되면, 다른 레벨도 정렬합니다.
ignore_index: 인덱스의 무시 여부입니다. True일 경우 인덱스의 순서와 상관없이 0,1,2,... 로 정해집니다.
먼저 np.NaN이 포함된 간단한 multi index 데이터를 만들어보겠습니다.
na = np.nan
index_tuples = [('row1', 'val1'), ('row1', 'val2'), ('row3', 'val3'), ('row3', 'val1'), ('row3', 'val2'), ('row2', 'val5'),('row2', 'val2')]
values = [ [1,2,3], [4,na,6], [7,8,9], [na,11,12], [13,14,15], [16,17,18], [19,20,21]]
index = pd.MultiIndex.from_tuples(index_tuples) # 인덱스 설정
df = pd.DataFrame(values, columns=['col4', 'col1', 'col2'], index = index)
print(df)
level을 지정하므로써 해당 level에서의 정렬이 가능합니다.
level이 0인 경우 row기준으로 정렬되는것을 확인 할 수 있습니다.
level이 1인 경우 val기준으로 정렬됨.
level과 ascending의 값을 list형태로 입력하므로써, 각 level에 다른 정렬방식의 사용이 가능합니다.
level이 1인 val이 내림차순 정렬되고, level이 0인 row가 오름차순 정렬된것을 확인 할 수 있습니다.
multi index에서 sort_remaining인수를 True로 할 경우 level별로 순차적으로 정렬이 진행됩니다.
만약 level을 따로 지정했다면, 해당 level부터 정렬한 후 나머지 level을 순차적으로 정렬합니다.
row정렬 후 val의 정렬까지 완료된 것을 확인할 수 있습니다.
nlargest메서드와 nsmallest메서드는 데이터를 오름차순/내림차순 정렬 후, 위에서 n개의 행을 출력하는 메서들입니다.
사실상 df.sort_values(columns, ascending=True/False).head(n)와 사용방식이 완전히 동일합니다.
사용법
df.nlargest(n, columns, keep='first')
df.nsmallest(n, columns, keep='first')
n: 정렬 후 출력할 행의 수 입니다.
columns: 정렬의 기준이 될 열 입니다.
keep:{first, last, all} 동일한 값일경우 어느 행을 출력할지 정합니다. first면 위부터, last면 아래부터, all이면 모두 출력합니다.
먼저 간단한 5x3짜리 DataFrame를 생성해보겠습니다.
col = ['col1','col2','col3']
row = ['row3','row5','row1','row4','row2']
data = [[ 1, 21, 7],
[ 2, 33, 3],
[ 2, 7,97],
[ 4, 56,31],
[ 5, 18, 5]]
df = pd.DataFrame(data=data, index=row, columns=col)
print(df)
keep인수를 통해 중복일경우의 출력할 행을 지정할 수 있습니다.
처음 발생한 값부터 출력(위쪽값 출력)
last일 경우
중복값을 모두 출력할 경우
여러 열을 동시에 고려하여 정렬하고자 한다면 list를 사용하면됩니다.
col1과 col3 모두에서 큰 값 기준 정렬할 경우 아래와 같습니다.
col1값을 먼저보고 col3값을 봄
combine 메서드는 두 pandas 객체를 func함수를 이용하여 결합하는 메서드입니다.
사용법
self.combine(other, func, fill_value=None, overwrite=True)
other: 결합 할 DataFrame객체 입니다.
func: 결합에 이용할 함수 입니다.
fill_value: 결합하기전 Na의 값을 이 값으로 대체합니다.
overwrite: other에 존재하지 않는 self의 열의 값을 NaN으로 대체합니다.
먼저 np.NaN이 포함된 간단한 3x3짜리 데이터 2개를 만들어보겠습니다.
n = np.nan
col = ['col1','col2','col3']
row = ['row1','row2','row3']
data1 = [[1,3,4],
[n,8,2],
[2,6,7]]
data2 = [[7,2,3],
[2,4,2],
[3,1,5]]
df1 = pd.DataFrame(data1,row,col)
df2 = pd.DataFrame(data2,row,col)
print(df1)
func 인수에 np.maximum을 입력하여 df1과 df2의 요소를 비교, 큰 값으로 결합하여 보겠습니다.
두 DataFrame 객체의 각 요소중 큰 값들로만 이루어진 것을 확인할 수 있습니다.
fill_value에 값을 입력하면, 결측치가 해당 값으로 채워진 후 결합이 진행됩니다.
col1, row2의 값이 NaN에서 9로 변경 된후 np.maximum이 진행된 것을 확인할 수 있습니다.
overwrite인수는 other에 존재하지 않는 self의 열의 요소를 NaN으로 변경하는 메서드입니다.
먼저 이해를 돕기 위해 2x2 데이터인 df3을 만들어 보겠습니다.
overwrite가 False일 경우 존재하지 않는 열에 대해서는 기존값으로 채워집니다.
overwrite가 True일 경우 존재하지 않는 열에 대해서는 NaN으로 채워집니다.
col3의 값이 모두 NaN으로 채워진 것을 확인할 수 있습니다.
combine_first 메서드는 other의 값으로 self(df)의 NaN값을 덮어쓰는 메서드입니다.
사용법
self.combine_first(other)
other: self객체의 결측치를 덮어쓸 객체 입니다.
먼저 np.NaN이 포함된 간단한 3x3짜리 데이터 2개를 만들어보겠습니다.
n = np.nan
col = ['col1','col2','col3']
row = ['row1','row2','row3']
data1 = [[n,n,1],
[n,n,1],
[1,1,1]]
data2 = [[2,2,2],
[2,n,2],
[2,1,2]]
df1 = pd.DataFrame(data1,row,col)
df2 = pd.DataFrame(data2,row,col)
print(df1)
print()
print(df2)
self객체의 NaN값을 other객체의 같은위치의 인수로 덮어쓰기 합니다.
만약 self에서 NaN인 값이 other에서도 NaN이라면 NaN을 출력합니다.
join 메서드는 두 객체를 인덱스 기준으로 병합하는 메서드 입니다.
사용법
self.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
other: self와 합칠 객체 입니다.
on: self의 열이나 인덱스 중에서 other의 어떤 열을 기준으로 결합할지 입니다.
즉, other의 (인덱스 기준이 아닌) 열 기준으로 결합할 때 on인수를 사용합니다.
how: {left : self기준 / right : other기준 / inner : 교집합 / outer : 합집합} 출력할 인덱스의 기준입니다.
lsuffix / rsffix: 이름이 중복되는 열이 있을 때 그 열에 추가로 붙일 접미사입니다.
lsuffix는 self의 열에 붙을 접미사고, rsuffix는 other의 열에 붙을 접미사입니다.
sort: 출력되는 데이터의 index를 사전적으로 정렬할지 여부입니다.
먼저 3개의 데이터를 만들겠습니다.
df1: row1, row2, row3을 가지며 col1을 가짐
df2: row3, row4를 가지며 col2를 가짐
df3: row3, row4를 가지며 col1을 가짐, 즉 df1과 중복되는 열을 가짐
df1 = pd.DataFrame({'col1':[1,2,3]},index=['row3','row2','row1'])
print(df1)
print()
df2 = pd.DataFrame({'col2':[13,14]},index=['row4','row3'])
print(df2)
print()
df3 = pd.DataFrame({'col1':[23,24]},index=['row4','row3'])
print(df3)
how인수를 통해 인덱스의 기준을 어떤 값으로 할지 정할 수 있습니다.
how=left인 경우 (기본값) df1의 인덱스를 기준으로 합니다.
how=right인 경우 df2의 인덱스를 기준으로 합니다.
how=outer인 경우 df1와 df2의 인덱스의 합집합을 기준으로 합니다.
how=inner인 경우 df1와 df2의 인덱스의 교집합을 기준으로 합니다.
`
sort 인수를 통한 인덱스의 정렬`
sort인수를 True로 설정할 경우 인덱스의 값을 사전적으로 정렬 할 수 있습니다.
sort가 False 인경우(기본값)
df1과 df3은 col1이라는 이름이 중복된 열을 가지기 때문에, join메서드를 사용할 경우 오류가 발생하게 됩니다.
이때, lsuffix / rsuffix 인수를 입력함으로서 기존 열 이름에 접미사를 붙일 수 있습니다.
인덱스가 아닌 열 기준으로 결합하기(+ on 인수의 사용) 먼저 IDX라는 이름의 열을 갖는 두 객체를 생성해보겠습니다`
join메서드는 기본적으로 index를 기준으로 결합하기 때문에, 열 기준으로 결합하기 위해서는
set_index메서드를 활용해 열을 인덱스로 변경하여 join메서드를 사용하면 됩니다.
하지만 위와 같이 진행 할 경우 기존 인덱스가 열 값으로 변경됩니다.
이를 방지하고 순수하게 열 기준으로 병합하려면 on 인수를 사용하면 됩니다.
merge메서드는 두 객체를 병합하는 메서드입니다. join과 비슷하지만 더 세부적인 설정이 가능한 메서드로,
인덱스-열 기준 병합도 가능하며, indicator인수를 통한 병합정보확인, validate를 통한 병합방식 확인등이 가능합니다.
사용법
merge주요 인자
right: 병합할 데이터프레임
how: 병합 방식 ('inner', 'outer', 'left', 'right', 'cross')
on: 공통 열 이름 (두 데이터프레임이 같을 때)
left_on / right_on: 열 이름이 다를 때 사용
left_index / right_index: 인덱스를 기준으로 병합할 때
suffixes : 중복된 열 이름에 접미사 추가indicator : 병합 정보 열 추가 여부 (True이면 병합 상태 표시)
병합 방식
'inner': 교집합
'outer': 합집합
'left': 왼쪽 기준
'right': 오른쪽 기준
'cross': 행렬곱
left_on / right_on에 열 이름을 입력하므로서 열 기준으로 병합이 가능합니다.
먼저 객체 2개를 만들어 보겠습니다.
df1에서는 IDX1을, df2에서는 IDX2를 기준으로 하여 두 객체를 병합하겠습니다.
IDX1과 IDX2의 값을 매칭하여 병합된 후 이름이 같은 VAL열에 대해서는 _x와 _y가 붙었습니다.
suffixes에 ('_left', '_right')를 입력하므로써 열 이름에 _left, _right를 붙일 수 있습니다.
left_index / right_index를 통해 인덱스 기준으로 두 객체를 병합할 수 있습니다.
먼저 병합할 두 객체를 만들어보겠습니다.
left_index와 right_index를 True로 입력하여 두 객체 모두 인덱스를 기준으로 병합할 수 있습니다.
left_on / right_on 과 left_index / right_index를 이용하여 양쪽의 기준을 설정해줌으로서, 인덱스와 열의 혼합 병합도 가능합니다.
예시를 위해서 새 객체 두개를 만들어보겠습니다.
df5는 인덱스를, df6은 열을 기준으로 하겠습니다.
이제 left_index는 True로하여 인덱스를 기준으로하고 right_on은 IDX로 하여 열 기준으로 병합하겠습니다.
how인수를 사용하여 병합된 객체의 인덱스의 기준을 정할 수 있습니다.
먼저 예시에 이용될 두 객체를 만들어 보겠습니다.
how=left인 경우 왼쪽 객체의 인덱스를 기준으로 합니다.
how=right인 경우 오른쪽 객체의 인덱스를 기준으로 합니다.
how=inner인 경우 양쪽 객체 모두가 공통으로 갖는 인덱스를 기준으로 합니다.(교집합)
how=outer인 경우 양쪽 객체의 인덱스 모두를 기준으로 합니다.(합집합)
indicator인수를 True로 할 경우 마지막 열에 _merge열을 추가하여 병합 정보를 출력합니다.
validate인수에 값을 입력하여 해당 병합방식이 맞는지 검증이 가능합니다. 병합 방식이 다를경우 오류를 출력합니다.
1:m인지 검증
m:1인지 검증. 병합 방식이 m:1이 맞기 때문에 결과값을 출력합니다.
how인수중 cross는 행렬의 곱집합을 의미합니다. 단순히 말하면 행렬의 모든 경우의수를 출력합니다.
예시를 위해 두 객체를 생성해보겠습니다.
이제 how인수에 cross를 입력하므로써 두 객체의 행렬곱을 출력하겠습니다.
align메서드는 두 객체를 특정 기준들에 맞추어 정렬하는 메서드입니다.
두개의 데이터를 튜플 형태로 반환한다는것을 반드시 명심하시기 바랍니다.
인수들에 따라 다양한 구현이 가능하므로 아래 사용법을 참고 바랍니다.
사용법
align 주요 인자
other: 정렬할 대상 객체
join: 정렬 기준 ('inner', 'outer', 'left', 'right')
axis: 정렬할 축 (0 - 인덱스, 1 - 열)
level: 멀티 인덱스에서 정렬할 수준
copy: 사본을 만들지 여부
fill_value: 결측치 채울 값
method: 결측치 채우는 방법 ('ffill', 'bfill')
limit: 결측치 채울 최대 개수
fill_axis: 결측치 채울 방향 (0 - 인덱스, 1 - 열)
broadcast_axis: 브로드캐스트할 축 (0 - 인덱스, 1 - 열)
먼저 일부 레이블을 공유하는 3x3짜리 데이터 2개를 만들어보겠습니다.
n = np.nan
col1 = ['col1','col2','col3']
row1 = ['row1','row2','row3']
data1 = [[1,2,3],[5,6,7],[9,n,11]]
col2 = ['col2','col3','col4']
row2 = ['row3','row4','row5']
data2 = [[10,11,12],[14,n,16],[18,19,20]]
df1 = pd.DataFrame(data1,row1,col1)
df2 = pd.DataFrame(data2,row2,col2)
print(df1)
print(df2)
join 인수를 이용해 {outer : 합집합 / left : df1기준 / right : df2기준 / inner : 교집합} 인 index로 출력합니다.
두개의 데이터를 튜플 형태로 반환하기 때문에 리스트 슬라이싱으로 따로 print를 진행해보겠습니다.
outer로 출력시 레이블이 df1과 df2 모두의 합집합으로 사용되고 있는것을 알 수 있습니다.
left로 출력시 df1의 레이블만 사용되는 것을 알 수 있습니다.
right로 출력시 df2의 레이블만 사용되는 것을 알 수 있습니다.
inner로 출력시 레이블이 df1과 df2 모두의 교집합으로 사용되고 있는것을 알 수 있습니다.
axis인수를 통해 정렬을 진행 할 축을 정할 수 있습니다. 기본적으로 두축 모두 입니다.
df1에 대해서만 inner로 출력하여 확인해보겠습니다.
axis를 0으로 하였을 경우 행 기준 inner인 row3만 정렬되었습니다.
axis를 1으로 하였을 경우 열 기준 inner인 col2, col3만 정렬되었습니다.
fill_value를 사용해서 결측치를 원하는 값으로 변경이 가능합니다.
단, 기존 객체에 입력되어있던 결측치의 경우 변경되지 않습니다.
method인수는 {ffill / bfill}를 이용해 위쪽 또는 아래쪽 값으로 결측치 보정이 가능합니다.
limit인수의 경우는 method인수를 통해 결측치 보정할 때, 몇개의 값을 보정할지 설정합니다.
ffill로 입력 시 결측값을 바로 위의 값과 동일하게, bfill로 입력 시 결측값을 바로 아래 값과 동일하게 변경 된것을 확인할 수 있습니다.
limit 설정시 각 레이블에 대해서 아래와 같이 설정한 갯수만 변경 됩니다.
fill_axis는 method및 limit를 어느축 기준으로 실행할지 여부입니다. 즉, 가로로 할지 세로로할지 여부입니다.
update메서드는 DataFrame의 열을 other객체의 동일한 열의 값으로 덮어씌우는 메서드입니다.
반환값 없이 원본이 변경됩니다.
사용법
self.update(other, join='left', overwrite=True, filter_func=None, errors='ignore')
other: self에 덮어씌울 객체 입니다.
join: {left} 기준이 될 인덱스 입니다. left만 선택 가능하므로 무시해도됩니다.
overwrite: {True / False} 덮어씌울 방식입니다. True면 self의 모든 데이터에 other을 덮어씌웁니다.
False면 self에서 Na인 값에 대해서만 덮어씌우기를 진행합니다.
filter_func: 덮어씌울값을 함수로 정할 수 있습니다.
errors: {raise / ignore} raise일 경우 self와 other 모두 Na가 아닌 값이 있을경우 오류를 발생시킵니다.
먼저 3x2짜리 데이터 2개를 만들어보겠습니다.
df1 = pd.DataFrame({'A':[1,2,3],'B':[n,5,6]})
print(df1)
print()
df2 = pd.DataFrame({'B':[24,n,26],'C':[37,38,39]})
print(df2)
overwrite인수가 True면 df1과 df2가 이름을 공유하는 열에 대해서 df2의 값을 df1에 덮어씌웁니다.
False일 경우 df1에서 Na인 값에 대해서만 덮어씌우기를 진행합니다.
※ df2에서 Na인 값의 경우 덮어씌워지지 않습니다.
overwrite=True일 경우(기본값)
overwrite=False일 경우
filter_func에 함수를 넣음으로서 원하는 값만 업데이트가 가능합니다.
6인 값에 대해서만 업데이트를 하도록 filter_func를 설정하겠습니다
errors인수를 raise로 할 경우 df1과 df2 모두 같은 위치에 Na가 아닌 값이 있을 경우 오류를 발생시킵니다.