파이썬 pivot_table 관련 질문 드립니다

조회수 2283회

아래와 같이 Dep, Name, Sales, X Sales 값에 대한 엑셀 데이터를 읽은 후,

Sales 기준 X Sales의 비율(X Sales/Sales*100)을 'rate' coulmn으로 추가하고,

Dep Name Sales X Sales rate
A h 10 7 70
B i 0 0 -
B j 5 2 40
B k 3 2 66.66
C l 4 2 50
C m 1 0 0

아래와 같은 방식으로 Dep을 기준으로 pivot_table을 적용하였더니, rate값이 단순 합계로 표시되었습니다.

pd.pivot_table(df, index='Dep', values=['Sales', 'X Sales', 'rate'], aggfunc=np.sum)
Dep Sales X Sales rate
A 10 7 70
B 8 4 106.66
C 5 2 50

최종적으로는 아래와 같이 rate를 각 Dep별 (X Sales의 합계/Sales의 합계x100)으로 표현하고 싶습니다.

Dep Sales X Sales rate
A 10 7 70
B 8 4 50
C 5 2 40

공부를 시작한지 얼마되지 않아서 기초적인 질문일 것으로 생각됩니다만, 어떻게 해결하면 될지 도움 부탁 드리겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 피벗테이블을 계산한 다음에 따로 column을 추가하면 어떨까요?

    import pandas as pd
    import numpy as np
    
    dates = pd.date_range('20130101', periods=6)
    d = {'Dep':['A','B','B','B','C','C'], "Sales":[10,0,5,3,4,1],"X Sales":[7,0,2,2,2,0]}
    df = pd.DataFrame(data=d)
    new_df=pd.pivot_table(df, index='Dep', values=['Sales', 'X Sales'])
    new_df['rate']=new_df.apply(lambda row: row['X Sales']/row['Sales']*100, axis=1)
    print(new_df)
    
    • 답변 감사 드립니다. 그렇지 않아도 따로 계산하여 column으로 추가하는 방법을 for문으로 구현해보았는데, lambda 함수를 사용하니까 훨씬 깔끔하네요. (아직 lamda는 어렵습니다. ㅠ) 혹시 분모가 0인 경우에는 나누기를 하지 않고 0으로 표시하도록 lambda함수를 사용할 수 있을까요? 공부에 많은 도움이 될 것 같습니다. (__) 알 수 없는 사용자 2017.2.15 17:41
    • 3항 연산자를 사용해 보시면 어떨까요? A if 조건 else B 이런 형식인데요. row['X Sales']/row['Sales']*100 if row['Sales']!=0 else 0 정토드 2017.2.16 10:29
    • 그리고 제 기억에 dataframe에 디폴트로 NaN인 경우의 값을 설정하는 기능이 있었던것 같아요. 그걸 찾아보셔도 좋겠네요. 정토드 2017.2.16 10:30
    • 넵 말씀하신 부분 잘 참고하고 NaN 처리 부분도 찾아보겠습니다. 감사합니다! 알 수 없는 사용자 2017.2.16 14:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)