2017-10-26 1 views
1

따라서 고급 피벗 질문이 있습니다. 이 출력 제공DataFrame을 통해 여러 열 집합을 플래그가 지정된 값 집합으로 피벗하는 동안 모든 열을 피벗하지 않으려면 어떻게합니까?

dfa = pandas.DataFrame([["g1","15","Annie","Bard"], ["g2","18","Lux","Annie"], ["g3","15","Olaf","Twitch"]], columns=["gameId", "duration", "Champ1", "Champ2"]) 

다음 데이터 프레임 고려해, 다음과 같은 스택 오버플로 질문에 how to pivot complex dataframe을 논리를 적용하여

enter image description here

을, 나는

pandas.melt(dfa, id_vars=['gameId']) \ 
    .set_index('gameId')['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=0) \ 
    .agg(np.sum) 

enter image description here

그러나, 나는 시간 열을 선회하고 싶지 않아 그래서 난 내 코드를 변경하고 'value_vars'

pandas.melt(dfa, id_vars=['gameId'], value_vars = ['Champ1','Champ2']) \ 
    .set_index('gameId')['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=0) \ 
    .agg(np.sum) 

enter image description here

를 추가 그리고 지금은 시간 열을 잃게됩니다. 고유하지 않으므로이 열은 인덱스가 아니지만 피벗하지 않으려합니다. 나는 'id_vars'또는 'set_index()'에 addit의 모든 조합을 시도했지만 작동하지 않는 것 같습니다.

생각하십니까?

미리 감사드립니다. 다음과 같이

답변

1

당신은 Multiindex 모두 수준으로 set_index 마지막 groupby에 다음 열 durationid_vars에 추가 할 수 있습니다

와 동일 무엇
a = pd.melt(dfa, id_vars=['gameId', 'duration']) \ 
    .set_index(['gameId', 'duration'])['value'] \ 
    .str.get_dummies() 
    .sum(level=[0,1]) 
print (a) 
       Annie Bard Lux Olaf Twitch 
gameId duration         
g1  15   1  1 0  0  0 
g2  18   1  0 1  0  0 
g3  15   0  0 0  1  1 

:

a = pd.melt(dfa, id_vars=['gameId', 'duration']) \ 
    .set_index(['gameId', 'duration'])['value'] \ 
    .str.get_dummies() \ 
    .groupby(level=[0,1]) \ 
    .sum() 
print (a) 
       Annie Bard Lux Olaf Twitch 
gameId duration         
g1  15   1  1 0  0  0 
g2  18   1  0 1  0  0 
g3  15   0  0 0  1  1 
+0

감사합니다,이 완벽합니다. 'gameId', 'duration'을 시도했지만 목록에없는 것도 아니고 그룹의 레벨도 가지고 있지 않았습니다. –

+0

당신은 오신 것을 환영합니다. Btw, 항상 '0'이 필요한 경우 '1'출력에는 'sum'이 아니라 'max'가 필요합니다. – jezrael

+0

그래서, 어떻게 지속 기간 = 15로 쿼리합니까? gameId = g1로 a.loc [: 'g1']을 사용하여 쿼리 할 수 ​​있지만 a.loc [: 15] 또는 a.loc [: '15']이 작동하지 않는 것 같습니다. –

관련 문제