Pandas의 groupby가 아니어야하는 요소도 모아져 NaN이 되어 버린다

3400 단어 pandas파이썬

소개



Pandas의 groupby는 매우 어렵고 초보자의 벽이라고 생각합니다.
저도 본격적으로 만져 처음 날이 얕고, 어디가 원인인지 잘 모르는 or 어떻게 알고리즘을 짜면 효율적으로 실현할 수 있을까 모색하는 나날입니다.
시간이 걸린 것에 관해서는 Qiita에 기사로서 정리하고 있으므로 봐 주세요.

이번은, groupby로 상정하고 있지 않는 움직임이 되어 곤란하고 있었습니다만, 질문 사이트에 투고했는데 디버그를 해 가는 사이에 진상에 도착해 있으므로 정리하고 싶습니다. 디버그하지 않았으면 해결에 이르지 못했던 위험합니다. (좋았다)

나와 같은 일이 된 쪽이 곧바로 해결할 수 있으면 좋겠습니다.

문제



다음과 같은 DataFrame이 있습니다.



이 데이터 프레임의 경우,
「도도부현명이 홋카이도의 행만을 추출해, 시구정촌명으로 groupby 해, 시구정촌마다의 면적의 평균치를 내린다」라고 하는 조작을 실시했습니다.
df[df["都道府県名"]=="北海道"].groupby('市区町村名').mean()

그러면 다음과 같은 결과가 반환되었습니다.



홋카이도에는 아키루시나 가고시마시 등은 물론 없습니다.

또한 원래 데이터 프레임은 47 도도부현, 618 종류의 시구정촌이 있습니다.
잘 추출이 되어 있지 않은가라고 확인했는데 모두 홋카이도, 시구정촌의 수는 18개가 되어 있었습니다.



여기에서 디버그하고 있어, Categories 에 왠지 모든 시구정촌명이 들어가 있습니다. 아마 이것이 원인인 것입니다만, 잘 모르는 상태였습니다.

그러나 이 디버그가 해결의 길이 되었다.

해결 방법



원인은 이 시구정촌명의 데이터형이 category型였던 것이었습니다.

실은, LightGBM을 움직이고 있어, 이하와 같은 처리를 전처리로서 실시하고 있었습니다.



이 처리로 인해 발생했습니다.
그러므로, 이 처리를 하지 않는 것으로 무사, groupby가 성공했습니다.



또, 아무래도 Category型 로 하고 싶은 경우는 이러한 방법으로 실현할 수 있습니다.
data.groupby(['都道府県名', '市区町村名'], observed=True).mean()
observed=True 로 실현 가능합니다.

결론



DataFrame 관계는 모르는 것뿐입니다만, 같은 문제를 예제로서 준비해, teratail 이나 stack over flow
서비스는 점점 활용해 나가야 한다고 생각합니다.

참고 사이트



Pandas의 groupby가 제대로 작동하지 않으므로 알려주세요.
Pandas groupby with categories with redundant nan

좋은 웹페이지 즐겨찾기