2025-04-10

장상희·2025년 4월 10일

파이썬

목록 보기
12/31

초과, 미만, 이상, 이하, 같음, 다름 (gt, lt, ge, le, eq, ne)

pandas.DataFrame.gt(other, axis='columns', level=None) >pandas.DataFrame.lt(other, axis='columns', level=None) <pandas.DataFrame.ge(other, axis='columns', level=None) >=pandas.DataFrame.le(other, axis='columns', level=None) <=pandas.DataFrame.eq(other, axis='columns', level=None) ==pandas.DataFrame.ne(other, axis='columns', level=None) !=

ltgtlegeeqne 메서드는 DataFrame의 크기 비교를 수행하는 메서드입니다.
각각 ><>=<===!=와 용도가 같습니다. 그리고 각 메서드는 사용법이 동일합니다.
※각각 less thangrater thanless equalgrater equalequalnot equal을 뜻합니다.

other : 스칼라, 시퀀스, Series, DataFrame, list등이 올 수 있습니다. 비교하고자 하는 값입니다.
axis : {0 : index / 1 : columns} 비교할 레이블 입니다.
level : 멀티인덱스 사용시 비교할 레이블의 레벨입니다.

객체생성

col = ['col1','col2','col3']
row = ['A','B','C']
df = pd.DataFrame(data=[[10,20,10],
                        [80,30,60],
                        [20,10,70]],index=row,columns=col)
df

>>
   col1  col2  col3
A    10    20    10
B    80    30    60
C    20    10    70

스칼라와의 비교시에는 단순히 other에 스칼라값을 입력하는것으로 실행할 수 있습니다.
비교 결과는 bool로 표시됩니다.

print(df.eq(10)) # 10과 같은 경우 True 표시
>>

    col1   col2   col3
A   True  False   True
B  False  False  False
C  False   True  False

Series로 입력할 경우 Series의 index를 통해 비교할 레이블의 설정이 가능합니다.

s1 = pd.Series([10,30],index=["col1","col3"])
print(df.gt(s1)) # col1에서 10이상, col3에서 30이상이면 True
>>
    col1   col2   col3
A  False  False  False
B   True  False   True
C   True  False   True

만약 존재하지 않는 레이블을 비교한다면, 해당 레이블이 생성(broadcast)됩니다.

s2 = pd.Series([10],index=["col4"])
print(df.lt(s2)) # df에는 col4가 없기 때문에 col4가 브로드캐스트 됩니다.
>>
    col1   col2   col3   col4
A  False  False  False  False
B  False  False  False  False
C  False  False  False  False

axis에 따른 비교의 차이

print(df.le([10,20,30], axis="columns")) # 열 기준으로 비교했을때 각각 10, 20, 30 이하면 True
>>
    col1   col2   col3
A   True   True   True
B  False  False  False
C  False   True  False
print(df.le([10,20,30], axis="index")) # 행 기준으로 비교했을때 각각 10,20,30 이하면 True
>>
    col1   col2   col3
A   True  False   True
B  False  False  False
C   True   True  False

DataFrame과의 비교

Series와 마찬가지로 특정 레이블이 일치하는 DataFrame과의 비교가 가능합니다.

※ 레이블이 일치하지 않을경우 해당 레이블이 생성(broadcast)됩니다.

먼저 간단한 3x1 짜리 DataFrame을 하나 만들어보겠습니다.

df2 = pd.DataFrame([[50],[50],[50]],index=row,columns=['col1'])
print(df2)
>>
   col1
A    50
B    50
C    50

이제 df와 비교해보겠습니다.

print(df.ge(df2)) # col1에 대해서 각각50, 50, 50 이상이면 True
>>
    col1   col2   col3
A  False  False  False
B   True  False  False
C  False  False  False

멀티 인덱스의 사용 (level인수)

먼저 간단한 멀티인덱스 데이터프레임을 하나 만들어보겠습니다.

row_mul = [['U','U','U','D','D','D'],['A','B','C','A','B','C']]
df_mul = pd.DataFrame(data=[[10,20,10],
                            [80,30,60],
                            [20,10,70],
                            [30,70,60],
                            [10,90,40],
                            [50,30,80]],index=row_mul,columns=col)
print(df_mul)
>>
     col1  col2  col3
U A    10    20    10
  B    80    30    60
  C    20    10    70
D A    30    70    60
  B    10    90    40
  C    50    30    80

이제 여기서 레벨을 선택하여 df와의 비교에 사용해 보겠습니다.

Copyprint(df.ge(df_mul,level=1)) # level=1이기 때문에 A, B, C를 index로하는 두 DataFrame과의 비교처럼
                             # 진행됩니다.
>>
      col1   col2   col3
U A   True   True   True
  B   True   True   True
  C   True   True   True
D A  False  False  False
  B   True  False   True
  C  False  False  False

dtype기반 열 선택 (select_dtyps)

select_dtypes 함수는 열에 포함된 데이터들을 type 기준으로 인덱싱 할 수 있도록 합니다.

select_dtypes(include=None, exclude=None) 형태를 가지며, include에 넣은값을 포함하고

exclude에 넣은 값을 제외한 columns(열)을 DaraFrame 형태로 반환합니다.


col1 = [1, 2, 3, 4, 5]
col2 = ['one', 'two', 'three', 'four', 'five']
col3 = [1.5, 2.5, 3.5, 4.5, 5.5]
col4 = [True, False, False, True, True]
df = pd.DataFrame({"col1": col1, "col2": col2, "col3": col3, "col4": col4})
print(df)

print(df.dtypes)

>>
   col1   col2  col3   col4
0     1    one   1.5   True
1     2    two   2.5  False
2     3  three   3.5  False
3     4   four   4.5   True
4     5   five   5.5   True
col1      int64
col2     object
col3    float64
col4       bool
dtype: object

include사용

include에 포함될 type을 입력함으로써, 해당 type인 열만 반환하는것이 가능합니다.

result = df.select_dtypes(include=[float,bool])
print(result)
>>
   col3   col4
0   1.5   True
1   2.5  False
2   3.5  False
3   4.5   True
4   5.5   True

exclude사용

exclude에 제외할 type을 입력함으로써, 해당 type인 열만 제외하여 반환하는것이 가능합니다.

result = df.select_dtypes(exclude=['int64'])
print(result)
>>
    col2  col3   col4
0    one   1.5   True
1    two   2.5  False
2  three   3.5  False
3   four   4.5   True
4   five   5.5   True
  • include & exclude 혼합 사용**

include에 포함될 type을, exclude에 제외할 type을 입력하여 혼용 인덱싱이 가능합니다.

Copyresult = df.select_dtypes(include =[float,object], exclude=['int64'])
print(result)
>>
    col2  col3
0    one   1.5
1    two   2.5
2  three   3.5
3   four   4.5
4   five   5.5

임계값 적용 (clip)

lower : 하한값입니다. 이 이하의 값은 이 값으로 변경됩니다.

upper : 상한값입니다. 이 이상의 값은 이 값으로 변경됩니다.

axis : 계산할 기준이되는 레이블입니다.

inplace : 제자리에서 계산할지 여부 입니다.

inplace의 개념은 간단합니다. 우리가 만약 print(df.dropna())로 df에서 NA를 제거한다고 가정해봅니다.

그럼 NA가 사라진 데이터가 출력되겠지만, 다시 print(df)할 경우 df는 변경되어있지 않을 것입니다.

이때 print(df.dropna(inplace=True))를 수행한다면 print(df) 실행 시 df에도 NA가 삭제되어있는것을

확인할 수 있습니다. 물론 dropna뿐만 아니라 clip처럼 inplace 인수를 가진 모든 함수에서 동일합니다.

즉, df.dropna(inplace=True)는 df = df.dropna( )와 같은 효과를 가집니다.

col  = ['col1','col2','col3']
row  = ['row1','row2','row3']
data = [[-7,3,9],
        [6,-8,1],
        [-3,0,-7]]
        
        
df = pd.DataFrame(data,row,col)
print(df)
>>
      col1  col2  col3
row1    -7     3     9
row2     6    -8     1
row3    -3     0    -7

일반적인 사용법

하한선을 -4로 상한선을 5로 clip메서드를 적용시켜보겠습니다.

즉, -4보다 작은수는 -4로. 5보다 큰 수 는 5로 변경되며 그 안의 수는 변경되지 않습니다.

print(df.clip(-4,5))#초과하는 모든 값을 정해진 값으로 변경한다
>>
      col1  col2  col3
row1    -4     3     5 #-7이 -4로 변경, 9가 5로 변경
row2     5    -4     1 # 6이 5로 변경 -8이 -4로 변겅
row3    -3     0    -4 # -7이 -4로 변경
    • 임계값을 Series로 설정**

임계값을 Series형태로 설정하여 각행이나 열마다 원하는 임계값의 지정이 가능합니다.

row1에는 -1~1, row2에는 -2~2, row3에는 -3~3으로 임계값을 지정해보겠습니다.

먼저 Series인 s를 설정해보겠습니다.

s = pd.Series(data=[1,2,3],index=row)
print(s)
>>
row1    1
row2    2
row3    3
dtype: int64

이제 임계값을 -s 와 s로 설정하여 clip메서드를 적용해보겠습니다.

Copyprint(df.clip(-s,s,axis=0))#행을 기준으로 모든 값이 변경된다
>>
      col1  col2  col3
row1    -1     1     1 # -1~1 으로 변경
row2     2    -2     1 # -2~2 로 변경
row3    -3     0    -3 # -3~3 으로 변경

레이블 필터링 (filter)

filter 메서드는 레이블에 대해서 조건에 맞는 레이블만 필터링하는 메서드입니다.

내용물이 아니라 레이블에 대해서만 필터링하는것을 유의하세요.

특정 레이블을 이름으로 필터링하거나, 포함된 문자열을 통해 필터링하거나, 정규표현식으로 필터링이 가능합니다.

정규표현식(regular expression)의 경우 regex라고도 하며 파이썬에서는 re 메서드가 지원하는 내용과 동일합니다.

※ 정규표현식의경우 웹상에 자료가 방대하므로 이 페이지에서는 설명하지 않겠습니다. 추후 별도 페이지로 생성 예정입니다.

df.filter(items=None, like=None, regex=None, axis=None)

items : 이름으로 필터링하는 경우입니다. 리스트형태로 입력합니다.

like : str로 필터링합니다. 해당 문자열이 포함된 경우를 반환합니다.

regex : 정규표현식을 이용해 필터링합니다. re.search(regex, label) == True에서 사용되는 경우와 동일합니다.

axis : {0 : index / 1 : columns} 필터링할 레이블입니다. 0은 행, 1은 열 입니다.

먼저 간단한 3x5짜리 데이터를 만들어보겠습니다.

col  = ['alpha','beta','gamma','delta','epsilon']
row  = ['sigma','omega','lambda']
data = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]]
df = pd.DataFrame(data,row,col)
print(df)
>>
        alpha  beta  gamma  delta  epsilon
sigma       1     2      3      4        5
omega       6     7      8      9       10
lambda     11    12     13     14       15

items 인수를 사용하는 경우

items인수를 통해 alphabeta 열을 필터링 해보겠습니다.

print(df.filter(items=['alpha','delta']))#알파와 델타만을 출력한다
>>
        alpha  delta
sigma       1      4
omega       6      9
lambda     11     14

omega행을 필터링해보겠습니다.

print(df.filter(items=['omega'],axis=0))#오메가를 행으로 출력한다
>>
       alpha  beta  gamma  delta  epsilon
omega      6     7      8      9       10
    • like 인수를 사용하는 경우**

like인수를 이용해 'ta'가 포함된 열을 필터링해보겠습니다.

print(df.filter(like='ta'))#ta가 포함된걸 출력한다
>>
        beta  delta
sigma      2      4
omega      7      9
lambda    12     14
    • regex 인수를 사용하는 경우**

regex인수를 사용해서 m과 n이 포함된 열을 필터링 해보겠습니다.

정규표현식 [ ] 는 [ ] 안의 모든 문자가 포함된 경우를 말합니다.

즉, [mn]m과 n이 포함된 경우입니다.

print(df.filter(regex='[mn]'))#m이나n이 포함된 모든걸 출력한다
>>
        gamma  epsilon
sigma       3        5
omega       8       10
lambda     13       15

g로 시작하는 경우에 대해 필터링 해보겠습니다.

정규표현식 ^는 ^뒤에있는 문자로 시작하는 문자열을 말합니다.

즉, ^g는 g로 시작하는 경우를 말합니다.

print(df.filter(regex='^g'))#g로 시작하는 걸 출력한다
>>
        gamma
sigma       3
omega       8
lambda     13

a로 끝나는 경우에 대해 필터링 해보겠습니다.

정규표현식 는 는 앞에있는 문자로 끝나는 문자열을 말합니다.

즉, a$는 a로 끝나는 경우를 말합니다.

print(df.filter(regex='a$'))# a로 끝나는 걸 모두 출력한다
>>
        alpha  beta  gamma  delta
sigma       1     2      3      4
omega       6     7      8      9
lambda     11    12     13     14

샘플 추출 (sample)

sample 메서드는 DataFrame이나 Series에서 무작위로 몇개의 값(레이블)을 출력하는 메서드입니다.

n : 추출할 갯수 입니다. replace가 False면 n의 최댓값은 레이블의 갯수를 넘을수 없습니다.
frac : 추출할 비율입니다. 1보다 작은값으로 설정하며(예 : 0.3 이면 30%), n과 동시에 사용할 수 없습니다.

replace : 중복추출의 허용 여부 입니다. True로 하면 중복추출이 가능하며 n의 최댓값이 레이블의 갯수보다 커도 됩니다.
weight : 가중치입니다. 즉 레이블마다 추출될 확률을 지정할 수 있습니다. 합계가 1(100%)이 아닐경우 자동으로 1로 연산합니다.
random_state : 랜덤 추출한 값에 시드를 설정할 수 있습니다. 원하는 값을 설정하면, 항상 같은 결과를 출력합니다.
ignore_index : index의 무시 여부입니다. True일경우 출력시 index를 무시하고 숫자로 출력합니다.
axis : {0 : index / 1 : columns} 추출할 레이블입니다.

col  = ['col1','col2','col3']
row  = ['row1','row2','row3','row4','row5']
data = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15]]
df = pd.DataFrame(data,row,col)
print(df)
>>
      col1  col2  col3
row1     1     2     3
row2     4     5     6
row3     7     8     9
row4    10    11    12
row5    13    14    15

n의 사용과 replcae의 사용

n을 설정함으로써 원하는 갯수의 추출이 가능합니다. n을 2로 설정함으로써 2개의 행이 추출된것을 볼 수 있습니다.

print(df.sample(2))
>>
      col1  col2  col3
row3     7     8     9
row4    10    11    12

행이 5이지만 replace=True로 설정하여 중복 추출을 허용한다면, n이 5보다 커도 됩니다.

print(df.sample(10,replace=True))
>>
      col1  col2  col3
row2     4     5     6
row4    10    11    12
row5    13    14    15
row5    13    14    15
row5    13    14    15
row1     1     2     3
row5    13    14    15
row2     4     5     6
row1     1     2     3
row1     1     2     3

frac를 사용하는경우

frac을 통해 전체에대한 추출 비율을 정할 수 있습니다. frac을 0.4로 설정하므로써, 전체에서 40%인 2개를 추출해보겠습니다.

 print(df.sample(frac=0.4))
 >>
      col1  col2  col3
row2     4     5     6
row5    13    14    15

weights를 통한 가중치의 사용

먼저 가중치를 적용하기위해 5짜리 Series를 하나 만들어보겠습니다.

s = pd.Series(data=[10,10,3,3,1],index=row)
print(s)
>>
row1    10
row2    10
row3     3
row4     3
row5     1
dtype: int64

이제 이 Series s를 weights에 적용시켜보겠습니다. 가장 가중치가 높은 row1row2가 추출된 것을 확인할 수 있습니다.

물론 가중치가 적더라도 확률적으로 추출될 가능성이 존재합니다.

print(df.sample(2,weights=s))
>>
      col1  col2  col3
row3     7     8     9
row2     4     5     6

random_state를 통한 동일값 재출력 허용

random_state에 원하는 값을 설정하므로써 출력 결과를 동일하게 다시 출력하는것이 가능합니다.

print(df.sample(5,random_state=7))
>>
      col1  col2  col3
row1     1     2     3
row4    10    11    12
row3     7     8     9
row2     4     5     6
row5    13    14    15

위 과정을 통해 row1row2row3row4row5가 출력되고 random_state에 7을 부여했습니다.

동일한 내용으로 다시 출력하면 같은 값이 아래와 같이 재현됨을 알 수 있습니다.

print(df.sample(5,random_state=7))
>>
      col1  col2  col3
row1     1     2     3
row4    10    11    12
row3     7     8     9
row2     4     5     6
row5    13    14    15

ignore_index의 사용

ignore_index를 True로 하면 index는 사라지고 순서대로 번호가 부여됩니다.

print(df.sample(3,ignore_index=True))
>>
   col1  col2  col3
0     7     8     9
1     4     5     6
2    10    11    12

결측값 확인 (isna, isnull, notna, notnull)

DataFrame.isna( )※ isnull( )과 완전히 동일합니다.

DataFrame.notna( )※ notnull( )과 완전히 동일합니다.

개요

isna 메서드와 notna 메서드는 DataFrame내의 결측값을 확인해서 bool형식으로 반환하는 메서드입니다.

isna의 경우 결측값이면 True 반환, 정상값이면 False반환이며,

notna의 경우 결측값이면False반환, 정상값이면 True를 반환합니다.

먼저 다양한 결측값이 포함된 간단한 4x4짜리 데이터를 만들어보겠습니다.

col  = ['col1','col2','col3','col4']
row  = ['row1','row2','row3']
data = [[1,2,pd.NA,4],
        [np.nan,6,7,8],
        [9,10,11,None]]
df = pd.DataFrame(data,row,col)
>>
      col1  col2  col3  col4
row1   1.0     2  <NA>   4.0
row2   NaN     6     7   8.0
row3   9.0    10    11   NaN

isna / isnull의 사용

isna나 isnull의 경우 결측값이면 True를 반환합니다.

print(df.isna())
>>
	       col1   col2   col3   col4 #isna기 때문에 결측값이 true로 출력함
row1  False  False   True  False
row2   True  False  False  False
row3  False  False  False   True

notna / notnull의 사용

notna나 notnull의 경우 결측값이면 False를 반환합니다.

Copyprint(df.notna())#notna는 isna의 반대로 출력한다
>>
       col1  col2   col3   col4
row1   True  True  False   True
row2  False  True   True   True
row3   True  True   True  False

결측값 제거 (dropna)

df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

axis : {0: index / 1: columns} 결측치 제거를 진행 할 레이블입니다.

how : {'any' : 존재하면 제거 / 'all' : 모두 결측치면 제거} 제거할 유형입니다. 포함만 시켜도 제거할지, 전무 NA여야 제거할지 정할 수 있습니다.

tresh : 결측값이 아닌 값이 몇 개 미만일 경우에만 적용시키는 인수 입니다.

예를들어, tresh값이 3이라면 결측값이 아닌 값이 3개 미만일 경우에만 dropna메서드를 수행합니다.

subset : dropna메서드를 수행할 레이블을 지정합니다.

inplace : 원본을 변경할지의 여부입니다.

예시

먼저 pd.NA가 포함된 간단한 4x5짜리 데이터를 만들어보겠습니다.

col  = ['col1','col2','col3','col4','col5']
row  = ['row1','row2','row3','row4']
data = [[1,2,3,pd.NA,5],[6,pd.NA,8,pd.NA,10],[11,12,13,14,15],[pd.NA,pd.NA,pd.NA,pd.NA,pd.NA]]
df = pd.DataFrame(data,row,col)
print(df)
>>
      col1  col2  col3  col4  col5
row1     1     2     3  <NA>     5
row2     6  <NA>     8  <NA>    10
row3    11    12    13    14    15
row4  <NA>  <NA>  <NA>  <NA>  <NA>

axis값에 따른 결측치 제거 수행

axis가 0인경우 행에 대해서, axis가 1인경우 열에 대해서 결측치 제거가 수행됩니다.

axis=0인 경우 결측치가 포함된 모든 행이 제거되었습니다.

print(df.dropna(axis=0))#결측치 포함 모든 행 제거
>>
     col1 col2 col3 col4 col5
row3   11   12   13   14   15

axis=1인 경우 결측치가 포함된 모든 열이 제거되었습니다. 예시의 경우 모든 열에 NA가 존재하므로 빈 값이 반환됩니다.

print(df.dropna(axis=1))#결측치 포함 모든 열 제거
>>
Empty DataFrame
Columns: []
Index: [row1, row2, row3, row4]

how로 연산기준을 정할 경우

기본적으로 how 는 'any'이며 이 경우 한 값이라도 NA를 가진다면 해당 레이블을 제거합니다.

print(df.dropna(how='any'))
>>
     col1 col2 col3 col4 col5
row3   11   12   13   14   15

how를 'all'로 할 경우 모든값이 NA인 레이블만 삭제됩니다.

print(df.dropna(how='all'))
>>
     col1  col2 col3  col4 col5
row1    1     2    3  <NA>    5
row2    6  <NA>    8  <NA>   10
row3   11    12   13    14   15

thresh 를 이용하는 경우

thresh를 이용하여 정상값의 수를 보장할 수 있습니다.

thresh가 3일 경우 정상값이 3개 미만인 경우에 대해서만 결측치 보정을 진행합니다.

print(df.dropna(thresh=3))
>>
     col1  col2 col3  col4 col5
row1    1     2    3  <NA>    5
row2    6  <NA>    8  <NA>   10
row3   11    12   13    14   15

thresh가 4인 경우 정상값이 4개 미만인 경우에 대해서 결측치 보정을 진행합니다.

print(df.dropna(thresh=4))
>>
     col1 col2 col3  col4 col5
row1    1    2    3  <NA>    5
row3   11   12   13    14   15

subset 인수를 통한 레이블 지정

subset에 리스트형태의 값을 입력함으로써 결측치 제거를 수행할 레이블을 지정할 수 있습니다.

col1col2에 대해서 결측치가 있는경우만 제거되었습니다.

print(df.dropna(subset=['col1','col2']))
>>
     col1 col2 col3  col4 col5
row1    1    2    3  <NA>    5
row3   11   12   13    14   15

inplcae 인수를 통한 원본의 수정

Pandas에서 공통적으로 inplace 인수는 원본의 수정을 의미합니다. inplace가 True인 경우 원본이 수정됩니다.

df.dropna(inplace=True)
print(df)
>>
     col1 col2 col3 col4 col5    #원본에 대해서도 결측치 제거가 수행됨.
row3   11   12   13   14   15

결측값 없는 인덱스 확인 (first_valid_index / last_valid_index)

first_valid_index메서드의 경우 처음으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.
last_valid_index메서드의 경우 마지막으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.
즉, 결측값만 있는 행은 무시한다고 생각하면 됩니다.

먼저 다양한 결측값이 포함된 간단한 5x2짜리 데이터를 만들어보겠습니다.

col  = ['col1','col2']
row  = ['row1','row2','row3','row4','row5']
data = [[np.nan,np.nan],[pd.NA,4],[pd.NA,pd.NaT],[5,6],[np.nan,pd.NA]]
df = pd.DataFrame(data,row,col)
print(df)
>>
      col1  col2
row1   NaN   NaN
row2  <NA>     4
row3  <NA>   NaT
row4     5     6
row5   NaN  <NA>

first_valid_index의 사용

first_valid_index메서드의 경우 처음으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.

이 경우 row2에서 처음으로 정상값인 4가 있으므로 row2를 출력합니다.

print(df.first_valid_index())
>>
row2

last_valid_index의 사용

last_valid_index메서드의 경우 마지막으로 결측치가 아닌값이 나오는 행의 인덱스를 출력합니다.

이 경우 row4이후에는 정상값이 없으므로 row4를 출력합니다.

Copyprint(df.last_valid_index())
>>
row4

결측값 변경 (fillna / backfill / bfill / pad / ffill)

fillna 메서드는 DataFrame에서 결측값을 원하는 값으로 변경하는 메서드입니다.

value : 결측값을 대체할 값입니다. dict형태로도 가능합니다.

method : 결측값을 변경할 방식입니다. bfill로 할경우 결측값을 바로 아래 값과 동일하게 변경합니다.

ffill로 할 경우 결측값을 바로 위 값과 동일하게 변경합니다.

axis : {0 : index / 1 : columns} fillna 메서드를 적용할 레이블입니다.

inplace : 원본을 변경할지 여부입니다. True일 경우 원본을 변경하게 됩니다.

limit : 결측값을 변경할 횟수입니다. 위에서부터 limit로 지정된 갯수만큼만 변경합니다.

downcast : 다운캐스트할지 여부입니다. downcast='infer'일 경우 float64를 int64로 변경합니다.

col  = ['col1','col2','col3','col4','col5']
row  = ['row1','row2','row3','row4','row5']
na = np.nan
data = [[na, 2,na, 4,na],
        [ 6, 7,na, 9,na],
        [11,na,na,14,15],
        [na,17,na,na,20],
        [na,22,na,na,25]]
df = pd.DataFrame(data,row,col)
print(df)
>>
      col1  col2  col3  col4  col5
row1   NaN   2.0   NaN   4.0   NaN
row2   6.0   7.0   NaN   9.0   NaN
row3  11.0   NaN   NaN  14.0  15.0
row4   NaN  17.0   NaN   NaN  20.0
row5   NaN  22.0   NaN   NaN  25.0

value의 형식에 따른 사용

value가 숫자나 문자일 경우 그대로 결측값을 대체하게 됩니다. 여기서는 A로 바꿔보겠습니다.

print(df.fillna('A'))
>>
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A    A  14.0  15.0
row4     A  17.0    A     A  20.0
row5     A  22.0    A     A  25.0

dict형태로 입력할 경우 각각 레이블값에 대해 원하는 값으로의 변경이 가능합니다.

dict = {'col1':'A','col2':'B','col3':'C','col4':'D','col5':'E'}
print(df.fillna(value=dict))
>>
      col1  col2 col3  col4  col5
row1     A   2.0    C   4.0     E
row2   6.0   7.0    C   9.0     E
row3  11.0     B    C  14.0  15.0
row4     A  17.0    C     D  20.0
row5     A  22.0    C     D  25.0

method인수를 사용하는 경우

method인수에 bfill을 입력할 경우 결측값이 바로 아래값과 동일하게 설정됩니다.

※ df.backfill( )이나 df.bfill( )과 완전히 동일한 기능을 수행합니다.

print(df.fillna(method='bfill'))
>>
      col1  col2  col3  col4  col5
row1   6.0   2.0   NaN   4.0  15.0
row2   6.0   7.0   NaN   9.0  15.0
row3  11.0  17.0   NaN  14.0  15.0
row4   NaN  17.0   NaN   NaN  20.0
row5   NaN  22.0   NaN   NaN  25.0

method인수에 ffill을 입력할 경우 결측값이 바로 위값과 동일하게 설정됩니다.

※ df.pad( )나 df.ffill( )과 완전히 동일한 기능을 수행합니다.

print(df.fillna(method='ffill'))
>>
      col1  col2  col3  col4  col5
row1   NaN   2.0   NaN   4.0   NaN
row2   6.0   7.0   NaN   9.0   NaN
row3  11.0   7.0   NaN  14.0  15.0
row4  11.0  17.0   NaN  14.0  20.0
row5  11.0  22.0   NaN  14.0  25.0

limit인수를 사용하는 경우

limit인수는 각 레이블값에 대해서 결측치 변경을 수행할 횟수입니다. 행 기준일경우 왼쪽부터, 열 기준일 경우 위에서부터 수행합니다.

print(df.fillna('A', limit=2))
>>
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A  NaN  14.0  15.0
row4     A  17.0  NaN     A  20.0
row5   NaN  22.0  NaN     A  25.0

downcast인수를 사용하는 경우

downcast 인수를 'infer'로 설정함으로써 float64형태를 int64형태로 변경할 수 있습니다.

print(df.fillna(0, downcast='infer'))
>>
      col1  col2  col3  col4  col5
row1     0     2     0     4     0
row2     6     7     0     9     0
row3    11     0     0    14    15
row4     0    17     0     0    20
row5     0    22     0     0    25

inplace를 사용하는 경우

다른 파이썬 객체에서와 마찬가지로 inplace는 원본을 덮어씌우는 기능과 유사한 기능알 합니다.

즉 df.fillna(0, inplace=True) 는 df=df.fillna(0)과 동일한 기능을 합니다.

df.fillna('A',inplace=True)
print(df)
>>
      col1  col2 col3  col4  col5
row1     A   2.0    A   4.0     A
row2   6.0   7.0    A   9.0     A
row3  11.0     A    A  14.0  15.0
row4     A  17.0    A     A  20.0
row5     A  22.0    A     A  25.0

결측값 없는 마지막 행 반환 (asof)

asof 메서드는 인덱스 기준으로 where이전에 결측치가 없는 마지막 행을 구합니다.

기본 사용법

df.asof(where, subset=None)

where : 기준이 되는 인덱스 값입니다.

subset : 기준이 되는 열 입니다.

먼저 결측치가 포함된 6x2짜리 객체를 생성해보겠습니다..

row = [10,20,30,40,50,60]
data = {'A':[1,n,n,4,5,6],'B':[7,8,9,10,n,12]}
df = pd.DataFrame(data=data, index = row)
print(df)
>>
      A     B
10  1.0   7.0
20  NaN   8.0
30  NaN   9.0
40  4.0  10.0
50  5.0   NaN
60  6.0  12.0

where이 단일값이면 반환은 Series형태로 하게 됩니다. subset을 입력하지 않으면 모든 열에대해서 조건을 만족하는 경우를 반환합니다.

print(df.asof(where=45))
>>
A     4.0
B    10.0
Name: 45, dtype: float64

45이전에 A열과 B열 모두 결측치가 없는 행은 40입니다. Index가 40인 값을 출력하였습니다.

입력값이 list인 경우

입력값이 list인 경우 list의 각각 요소에 대해 조건을 만족하는 행을 DataFrame 형태로 반환합니다.

print(df.asof(where=[10,45,60]))
>>
      A     B
10  1.0   7.0
45  4.0  10.0
60  6.0  12.0

10이전에 A와 B모두 결측치가 없는 행은 10입니다.

45이전에 A와 B모두 결측치가 없는 행은 40입니다.

60이전에 A와 B모두 결측치가 없는 행은 60입니다.

subset의 사용

subset을 이용해 특정 열에 대해서만 만족하는 경우를 반환할 수 있습니다.

A에 대해서만 연산 할 경우

print(df.asof(where=[10,35,60],subset='A'))
>>
      A     B
10  1.0   7.0
35  1.0   7.0
60  6.0  12.0

10이전에 A에 대해서 결측치가 없는 행은 10입니다.

35이전에 A에 대해서 결측치가 없는 행은 10입니다.

60이전에 A에 대해서 결측치가 없는 행은 60입니다.

B에 대해서만 연산 할 경우

print(df.asof(where=[10,35,60],subset='B'))
>>
      A     B
10  1.0   7.0
35  NaN   9.0
60  6.0  12.0

10이전에 B에 대해서 결측치가 없는 행은 10입니다.

35이전에 B에 대해서 결측치가 없는 행은 30입니다.

60이전에 B에 대해서 결측치가 없는 행은 60입니다.

profile
프로그래머 꿈나무

0개의 댓글