2016-10-25 2 views
4

팬더의 pd.pivot() 또는 pivot_table() 함수에 문제가 있습니다.팬더의 트러블 피벗 (R 확산)

나는이있다 : 나는 모든 것을 시도했습니다

dt site_id FGE WSH 
1   a  8  5 
1   b  3  7 
1   c  1  5 
2   a  2  3 
2   b  5  7 
2   c  2  5 

:

df = pd.DataFrame({'site_id': {0: 'a', 1: 'a', 2: 'b', 3: 'b', 4: 'c', 5: 
'c',6: 'a', 7: 'a', 8: 'b', 9: 'b', 10: 'c', 11: 'c'}, 
        'dt': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1,6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2}, 
        'eu': {0: 'FGE', 1: 'WSH', 2: 'FGE', 3: 'WSH', 4: 'FGE', 5: 'WSH',6: 'FGE', 7: 'WSH', 8: 'FGE', 9: 'WSH', 10: 'FGE', 11: 'WSH'}, 
        'kw': {0: '8', 1: '5', 2: '3', 3: '7', 4: '1', 5: '5',6: '2', 7: '3', 8: '5', 9: '7', 10: '2', 11: '5'}}) 


df 
Out[140]: 
    dt eu kw site_id 
0 1 FGE 8  a 
1 1 WSH 5  a 
2 1 FGE 3  b 
3 1 WSH 7  b 
4 1 FGE 1  c 
5 1 WSH 5  c 
6 2 FGE 2  a 
7 2 WSH 3  a 
8 2 FGE 5  b 
9 2 WSH 7  b 
10 2 FGE 2  c 
11 2 WSH 5  c 

내가이 원하는!

df.pivot_table(index = ['site_id','dt'], values = 'kw', columns = 'eu') 

또는

df.pivot(index = ['site_id','dt'], values = 'kw', columns = 'eu') 

은 일을해야합니다. 나는 또한) (언 스택 시도 : 그것은 당신에게 문제가 준 이유 ( unstack와)

df.set_index(['dt','site_id','eu']).unstack(level = -1) 

답변

4

귀하의 마지막 시도가 나를 위해 잘 작동, 나는 확실하지 않다. FWIW, 나는이 수준보다는 인덱스 이름을 사용하는 것이 더 읽을 생각, 그래서 나는 다음과 같이했다 :

>>> df.set_index(['dt','site_id','eu']).unstack('eu') 

      kw  
eu   FGE WSH 
dt site_id   
1 a   8 5 
    b   3 7 
    c   1 5 
2 a   2 3 
    b   5 7 
    c   2 5 

그러나 다시, 당신의 방법은 나에게 잘 보이는 꽤 많이했다 @piRSquared 것과 동일 (그들의 답변이 다중 색인을 없애기 위해 더 많은 코드를 추가하는 것을 제외하고).

pivot의 문제점은 목록이 아닌 하나의 변수 만 전달할 수 있다는 것입니다. 어쨌든, 이것은 나를 위해 작동 :

pivot_table를 들어
>>> df.set_index(['dt','site_id']).pivot(columns='eu') 

, 주요 문제는 'kw는'객체/문자이고 pivot_table 기본적으로 numpy.mean으로 집계 시도 할 것입니다. "DataError : 집계 할 숫자 유형이 없습니다."라는 오류 메시지가 표시됩니다.

그러나 몇 가지 해결 방법이 있습니다. 문자열 요약 될 수 있다는 사실을 사용하고

>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu', 
        aggfunc=sum) 

이 (concatentated : 당신 같은 pivot_table 명령 첫째, 당신은 단지 숫자 형식으로 변환 할 수 있습니다 후 사용

>>> df['kw'] = df['kw'].astype(int) 
>>> df.pivot_table(index = ['dt','site_id'], values = 'kw', columns = 'eu') 

은 또한 당신은 집계 함수를 변경할 수 있습니다) 당신이 그 (것)들의 평균을 가지고 갈 수 없더라도. 실제로 문자열에서 작동하는 대부분의 함수 (람다 포함)를 사용할 수 있습니다.

그러나 셀 당 하나의 값만 있더라도 pivot_table'saggfunc에 일종의 축소 연산이 필요하므로 실제로 줄일 수있는 항목이 없습니다. 그러나 코드에서 감소 작업이 필요한 체크가 있으므로이를 수행해야합니다.

+0

아하겠습니다. 왜 aggfunc가 필요한지 혼란 스러웠습니다. 바라기를 그들은 다음 갱신에있는 그 필요를 제거한다 :) – Zafar

2
df.set_index(['dt', 'site_id', 'eu']).kw \ 
    .unstack().rename_axis(None, 1).reset_index() 

enter image description here