본문 바로가기

Pandas/응용

판다스 - groupby : filter (len, size, count)

반응형

데이터 불러오기

 

타이타닉의 일부 컬럼

 

 

class 별로 그룹화 했다.

 

 

 

 

 

 

 

[목표 : 클래스별로 일정 수 이상의 그룹만 보고 싶다]

 

1. len

 

그룹별로 길이를 구했다.

 

이는 누락값의 유무와 관계 없으므로 다 동일한 결과가 출력된다.

 

 

 

 

 

 

 

200건 이상의 데이터가 있는지에 대한 불린을 보자

 

 

First 클래스와 Third 클래스는 모든 열이 다 200건 이상 있으므로

 

다 True가 나왔다.

 

이때 Second 그룹만 없이 보고 싶을때 이용하는 것이 바로

 

filter 메서드 이다.

 

 

 

 

 

 

 

filter

 

총 891건의 데이터 중 184건의 데이터가 제외된

(Second 그룹은 제외된)

 

707행의 나왔다.

 

*** filter를 하니 기존 그룹용 컬럼인 class는 사라졌다.

(grouped라는 변수명 사용 때문)

 

 

 

 

 

 

 

 

2. size

size는 문제가 좀 많아 보인다.

 

 

우선 그룹별 행의 개수를 구했다.

 

 

 

 

 

300건 이상이 입력된 데이터 그룹을 보고자 불린을 해보았고

 

Third 그룹만 만족하는 것을 확인했다.

 

 

 

이를 필터 메서드로 해보자.

 

 

뜬금없이 891행, 

 

즉 전체 데이터가 나왔다.

 

 

 

https://steadiness-193.tistory.com/36

 

판다스 - groupby : aggregate, size

데이터프레임 DataFrameGroupBy SeriesGroupBy .size() 시리즈 .size 데이터 불러오기 grp 컬럼을 기준으로 그룹화했으며 first를 이용해 그룹화된 데이터프레임을 살펴본다. 타입은 DataFrameGroupBy이기에 .siz..

steadiness-193.tistory.com

 

위 포스팅 내 주의할 점에 언급한 것처럼 컬럼명을 명시하지 않아서 일까?

 

 

 

 

 

 

class로 그룹화했기에 class 컬럼을 명시했다.

 

불린은 정상적으로 나옴을 확인할 수 있다.

 

 

 

 

이를 바로 filter로 적용해보자

 

 

어찌된 일인지 에러가 나온다.

 

이는 filter를 할때는 그룹화된 컬럼(class)이 사라짐에 기인한 것으로 추측한다.

 

 

 

 

 

 

--------------------------------------------------------------------------------------------

 

 

 

* 참고 : 해결 방법 *

 

 

grouped 변수를 사용하지 않고, df.groupby('class')를 직접 명시

 

 

 

자세한 내용은 아래 포스팅 참조

 

https://steadiness-193.tistory.com/45

 

판다스 - groupby : apply, filter 등 주의할 점

groupby를 한 객체를 변수에 넣느냐 넣지않고 진행하느냐에 따라 그룹화에 이용된 컬럼이 남아있는가, 사라지는가가 달라진다. 예시를 들어 살펴보자 데이터 불러오기 244행의 tips 데이터를 불러��

steadiness-193.tistory.com

 

 

 

 

--------------------------------------------------------------------------------------------

 

 

 

 

 

그렇다면 다른 컬럼을 기준으로 filter하면 어떻게 될까?

 

 

age 컬럼을 기준으로 filter 하니 정상적으로 나옴을 확인했다.

 

그러나 이는 굉장히 비효율적이다.

 

그 이유는 그냥 1번의 len을 쓰면 컬럼을 명시할 필요도 없고

 

에러도 나지 않으며

 

size와 len은 행의 개수를 세는 것으로 본다면 비슷하기 때문이다.

 

따라서 오류와 번거로움이 혼재될 수 있는 size는

 

행의 개수 필터링에선 지양하는 것으로 한다.

 

(또는 위 해결방법을 이용한다.)

 

 

 

 

 

 

3. count

 

 

count가 다소 까다로운 이유는 누락값을 세지 않기 때문이다.

 

 

따라서

 

 

이렇게 무작정 200개 이상 누락값을 제외하고

 

입력된 그룹을 보여달라는 명령은 에러가 나올 확률이 높다.

(당연한 결과다.)

 

 

 

 

차근히 보자

 

모두 True인 그룹이 없다.

 

입력값이 200개가 넘어야하는 조건에는

 

그룹별로 컬럼별로 상이하다.

 

예를 들어 Third 그룹을 출력하고자해도

 

deck이 False이기 때문에 출력할 수 없는 것이다.

 

 

이럴때 이용하는 것이 바로 

 

 

 

https://steadiness-193.tistory.com/35

 

판다스 - groupby : aggregate (agg 메서드 안의 기준 컬럼, count 이용)

데이터 불러오기 C 컬럼의 초성별로 그룹화 했다. count 각 컬럼별 누락값을 제외한 값을 셌다. 1보다 큰 값을 가지는 불린 데이터프레임도 나타냈다. 여기서 agg() 메서드를 이용해보자 위의 결과��

steadiness-193.tistory.com

 

위 포스팅에서 설명한 'agg 메서드 안의 기준 컬럼'이다

 

 

 

agg 메서드 안에 컬럼을 명시하면

 

그 컬럼을 기준으로 다른 컬럼의 값들도 통일된다.

 

지금은 age 컬럼의 값인 186, 173, 355로 모두 행별 통일되었다.

 

 

 

 

이를 비교조건에 넣으면

 

Third 그룹은 모두 True가 나오게 된다.

 

 

 

filter도 agg의 기능과 맥을 같이하기 때문에 

 

이를 이용하면

 

 

age컬럼을 기준으로 조건에 모두 True인 

 

Third 그룹의 데이터만 볼 수 있는 것이다.

(491행)

 

 

 

 

[정리]

groupby 기준

 

 

1. 행의 개수를 필터링해서 보고자할땐 'len'을 사용하자.

 

* 또는 groupby객체를 변수에 넣지 말고 그대로 이용하자

 

 

 

 

2. 하나의 컬럼을 기준으로 입력값의 개수를 필터링할 땐

'count'를 이용하자

 

** 컬럼명을 반드시 기입할 것

반응형