본문으로 바로가기

설명을 도울 데이터프레임

1. Masking

- 데이터마스킹(개인정보로 민감한 데이터를 숨기는 것)과는 다른 내용

- 특정열에 어떤 값을 변경하고자 할 때 사용

- 판단의 기준이 DataFrame, 다시 말해 df[ ] 내부에 df[ ] 구조가 있는 것이라 생각하면 된다.

 

- 아래 예시를 통해, 검거율 100% 이상이였던 값들이 100으로 변경된 것을 확인할 수 있다.

gu_df[ gu_df[['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']] > 100 ] = 100
gu_df.tail(10)

 

 

- 조금 더 나아가서, 똑같은 조건을 Masking을 쓰지 않고 코드를 작성해보면, 아래와 같이 작성된다.

columns = ['강간검거율', '강도검거율', '살인검거율', '절도검거율', '폭력검거율']
gu_df_rate = gu_df[columns]

# iterrows() : iterable을 행이름, 행 단위로 하나씩 꺼내주는 함수
for row_index, row in gu_df_rate.iterrows():
    for column in columns:
        if row[column] > 100:
            # at[ ] : 행, 열 directly 가리킬 수 있는 함수
            gu_df.at[row_index, column] = 100 
            
gu_df.tail(10)

 

 

위의 코드에서 눈여겨 봐야할 함수는 iterrows와 at이다.

 

1) iterrows()

- DataFrame.iterrows()

- 각 행의 이름과 행을 출력해준다.

- 아래와 같이 row_index가 행의 이름, row가 행임을 확인할 수 있으며, 두 개의 인자가 아닌 하나의 인자로 받을 때는 tuple로 출력된다.

 

2) at[ ]

(출처: https://kongdols-room.tistory.com/117)

- 패스트 인덱싱 메소드 중 하나 

- 하나의 스칼라 값에 접근하는 데 특화되어 있으며, Series와 DataFrame에서 모두 사용 가능하다.

- 다수의 행/열에 접근할 수 있는 df.loc[ ]와 달리, df.at[ ]는 하나의 값에만 접근 가능하다는 것이다

- loc과 동일하게 label 기준으로 데이터에 접근한다.

# Series에서의 사용
Series.at['index_label']

# DataFrame에서의 사용
DataFrame.at['index_label', 'column_label']

 

 


2. Filtering

- 특정 행/열을 꺼내고자 할 때 사용

- Masking과 달리, 판단의 기준이 Series

- 다시 말해, df[ ] 내부에 Series가 있는 것이라 생각하면 된다.

- 필터링에서 논리 연산자는 and, or, not 대신 "&", "|", "~"을 사용한다.

gu_df[ gu_df['살인(발생)'] == 0 ]

# and
gu_df[ (gu_df['살인(발생)'] > 7) & (gu_df['폭력(발생)'] > 2000) ]

# or
gu_df[ (gu_df['살인(발생)'] > 7) | (gu_df['폭력(발생)'] > 2000) ] 

# not
gu_df[ ~ (gu_df['살인(발생)'] > 5) ]

 

- 에러 :

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

 

필터링에서 1) 잘못된 논리 연산자를 사용하거나, 2) 두 개 이상의 조건을 적을 때 ( )로 범위를 지정해 주지 않는다면 위의 에러가 발생하게 된다.