파이썬 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
댓글 입력