데이터 사이언스(Data Science)/데이터 분석, 자료분석(Data)

[Python] pandas에서 반복적인 행 접근할 때(Data Processing)

게임이 더 좋아 2020. 8. 6. 13:28
반응형
728x170

 

***맨 아래 방법별 속도가 요약 되어있다.

 

 

데이터 처리를 할 때 index(거의 행) 마다 접근을 하면서 그 값을 조작하는 경우가 많은데

예를 들어, 결측치(missing value)를 다른 값으로 바꾸고 싶을 경우 반복적으로 접근을 해야 한다.

 

++결측치가 한 두개가 아니니까..? 많이 조작을 해야겠지???

 

사람들이 말하길 4가지가 있다고 한다.

 

 

1) pd.iterrows()

 

*조금 느리다는 단점이 있다.(??? 그렇다네)

 

iterrows() 자체가 그냥 모든 행을 반복 접근한다고 보면 된다. 

 

+++ iterrows()는 Series for each row를 return 한다. 

 

그래서 이런 식으로 짠다면

 

1. (df, col)을 argument로 가짐

2. df를 iterrows(): 를 적용하면 "df의 index of the row는 i로" , "data of row 는 Series형태로 row로" 들어간다.

3.  row의 값 중 col 다시 말해서 column을 선택해 그 값을 val에 넣는다

4. val 의 값이 0이면 df의 i번째 row 에서 col의 값을 nan으로 바꾼다.

 

이해하기 쉽지?? 블로그에서는 이렇게만 나와있어서 쉽게 풀어썼다.

 

 

2) pd.loc[]/pd.iloc[]

 

두번째 방법은 index를 통해 for문을 돌면서, loc, iloc 함수를 통해 df의 row에 접근하는 방법이다. 

1. df와 col을 argument로 받는다.

2. df의 index를 i로 받는다.

3. val에다 df의 i번째 인덱스의 col 값을 넣는다.

4. val이 0이면 df의 i번째 인덱스의 col 값을 nan으로 바꾼다.

 

 

이게 더 쉬워보인다.

근데 iterrows()보다 3배정도 빠르다는 것을 알 수 있다.

 

물론 데이터 형태에 따라 시간은 차이가 날 수 있지만 어떻든 빠르다는 얘기다.

 

 

 

 

3)pd.get_value()/pd.set_value()

 

3번째 방법으로는 index를 통해 for문을 돌면서 get_value와 set_value를 이용하겠다는 말이다.

++ 처음 내가 든 생각으로는 느리다고 생각했다. (뭐하러 메서드를 더 쓰나?)

 

1. df, col을 argument로 받는다

2. df의 index를 i에 받는다

3.  i번째 인덱스의 col값의 접근을 get_value()를 통해 얻어 val에 집어넣는다.

4. val의 값이 0일 경우 i번째의 col값의 값을 set_vaule()를 통해 nan으로 바꾼다.

 

 

++이게 웬 걸... 더 빠르단다. 1보다 10배? 2보다 3배 더 빠르단다. 

 

 

4)pd.apply()

 

마지막 방법..

 

apply()를 이용하는 것이란다. 또 이게 무슨 메서드냐...?

 

우선 뭘 return하나 봤더니 Series or DataFrame을 한다고 한다.

 

그렇다면 어떻게 적용시키느냐??

위의 메서드를 만들어서 적용시킨다. (helper function)이라고도 한단다.

 

이거는 설명할 필요도 없겠다. 

 

그렇지만 위의 함수는 Series나 Dataframe의 각 원소마다 적용시켜줘야 하기에

어차피 for문을 돌릴터이다. 

 

 

 


 

 

요약

 

속도 

3>>>2>>>1

번외 4 (간단한 작업을 할 때)

 

각 방법마다 장,단점이 있을 것이다.

다만 데이터 접근, 변경을 같이 하고 싶다면 3을 고려해보는 것이 어떨까 싶다.

 

++특정 원소만 작업하고 싶다?? 4번 ㄱㄱ

 


 

참고링크

https://3months.tistory.com/419

위의 내용과 거의 같다. 다만 나는 쉽게 내가 이해하기 쉽도록 쓸 뿐이다.

다른 사람도 이해하기 쉬웠으면 좋겠다. 

 

728x90
반응형
그리드형