[Python pandas] pivot_table() 할 때 DataError: No numeric types to aggregate 에러 대처방법 aggfunc='first'
Python 분석과 프로그래밍/Python 데이터 전처리 2019. 7. 11. 23:11이번 포스팅에서는 Python pandas의 pivot_table() 함수를 사용할 때
- (1) 'DataError: No numeric types to aggregate' 에러가 왜 생기는지
- (2) 'DataError: No numeric types to aggregate' 에러 대응방법은 무엇인지에 대해서 알아보겠습니다.
먼저 예제로 사용할 간단한 DataFrame을 만들어보겠습니다.
In [1]: import numpy as np ...: import pandas as pd In [2]: df = pd.DataFrame({'id': [1, 1, 2, 2, 3, 3], ...: 'col': ['x1', 'x2', 'x1', 'x2', 'x1', 'x2'], ...: 'sum': [30, 10, 70, 40, 20, 80], ...: 'name': ['a', 'a', 'b', 'b', 'c', 'c']}) ...: ...: df Out[2]: col id name sum 0 x1 1 a 30 1 x2 1 a 10 2 x1 2 b 70 3 x2 2 b 40 4 x1 3 c 20 5 x2 3 c 80
|
이제 pandas의 pivot_table() 함수를 이용해서 'id'변수를 index로, 'col' 변수를 열(column)로 하여 'sum'이라는 숫자형 데이터 값(values)을 재구조화(pivot) 해보겠습니다. pivot_table() 함수의 집계함수(aggregation function)의 디폴트 설정은 평균(aggfunc='mean')으로 되어 있습니다. 아래 코드는 문제 없이 잘 수행이 되었습니다.
In [3]: df.pivot_table(index = 'id', columns='col', values=['sum']) Out[3]: sum col x1 x2 id 1 30 10 2 70 40 3 20 80 In [4]: df.pivot_table(index = 'id', columns='col', values=['sum'], aggfunc='mean') ...: Out[4]: sum col x1 x2 id 1 30 10 2 70 40 3 20 80
|
(1) 'DataError: No numeric types to aggregate' 에러가 왜 생기는가? |
이번에는 'id' 변수를 index로, 'col'변수를 열(column)변수로 하는 것은 위와 동일하나, 재구조화하는 테이블의 값(value)으로 숫자형(nemeric)이 아니라 문자형(character)인 'name' 변수를 사용해보겠습니다. 그러면 아래와 같이 'DataError: No numeric types to aggregate'라는 DataError가 납니다. 왜냐하면 값(values) 으로 사용하려는 'name' 변수가 집계가 불가능한 문자형 데이터이기 때문입니다. (numeric only)
In [5]: df.pivot_table(index = 'id', columns='col', values=['name']) # default aggfunc='mean' Traceback (most recent call last): File "<ipython-input-5-9a2cccdff2ef>", line 1, in <module> df.pivot_table(index = 'id', columns='col', values=['name']) File "C:\Users\admin\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3048, in _cython_agg_general how, numeric_only=numeric_only) .... 중간 생략 .... DataError: No numeric types to aggregate
|
(2) 'DataError: No numeric types to aggregate' 에러 대응방법은? |
집계함수를 aggfunc='first' 로 명시적으로 설정해 줌으로써, 디폴트인 'mean' 을 사용해서 집계하는 것이 아니라 재구조화하는 기준의 테이블의 각 cell의 첫번째 값('first')을 그냥 가져오게끔 해주면 됩니다.
In [6]: df.pivot_table(index = 'id', columns='col', values=['name'], aggfunc='first') Out[6]: name col x1 x2 id 1 a a 2 b b 3 c c
|
집계함수 aggfunc='first' 로 해서 pivot 한 테이블의 값(values)을 하나가 아니라 여러개로 할 수도 있습니다. (이렇게 하면 숫자형 변수 'sum'도 집계를 하는 것이 아니라 각 테이블 cell의 첫번째 값을 가져오게 됨)
In [7]: df.pivot_table(index = 'id', columns='col', values=['name', 'sum'], aggfunc='first') Out[7]: name sum col x1 x2 x1 x2 id 1 a a 30 10 2 b b 70 40 3 c c 20 8
|
많은 도움이 되었기를 바랍니다.