[Pandas 기초] 4. DataFrame 집계
Python Library 중 하나인 Pandas에서 DataFrame을 집계하는 방법을 알아보자.
- 상세 데이터가 아닌 집계된 데이터에 대한 분석을 자주 요구하니 익숙해져야 할 내용임.
- sum(), mean(), max(), min(), count() 메소드를 사용해 지정한 열 또는 열들을 기준으로 집계한다.
Groupby
df.groupby(['집계기준변수'], as_index=)['집계대상변수'].집계함수
- 집계기준변수 : ~~별에 해당되는 변수 혹은 리스트. 범주형 변수 (ex: 월 별, 지역 별 등)
- 집계대상변수 : 집계함수로 집계할 변수 혹은 리스트. (ex: 매출액 합계)
- as_index = True (Default)
- 집계기준변수를 인덱스로 사용
1
2
3
4
5
6
# 데이터 읽어오기
path = 'https://raw.githubusercontent.com/DA4BAM/dataset/master/Attrition_simple2.CSV'
data = pd.read_csv(path)
# 상위 5개 확인
data.head(5)
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 33 | 7 | 817 | Male | 3 | Married | 11691 | No | 11 | 14 |
1 | 0 | 35 | 18 | 1412 | Male | 4 | Single | 9362 | No | 11 | 10 |
2 | 0 | 42 | 6 | 1911 | Male | 1 | Married | 13348 | No | 13 | 18 |
3 | 0 | 46 | 2 | 1204 | Female | 1 | Married | 17048 | No | 23 | 28 |
4 | 1 | 22 | 4 | 593 | Male | 3 | Single | 3894 | No | 16 | 4 |
열 하나 집계
1
2
# MonthlyIncome 합계
data['MonthlyIncome'].sum()
1
7798045
1
2
# MonthlyIncome, TotalWorkingYears 각각의 평균
data[['MonthlyIncome', 'TotalWorkingYears']].mean()
1
2
3
MonthlyIncome 6520.104515
TotalWorkingYears 11.330268
dtype: float64
1
2
# MaritalStatus 별 Age 평균 --> 시리즈
data.groupby('MaritalStatus', as_index=True)['Age'].mean()
1
2
3
4
5
MaritalStatus
Divorced 37.522727
Married 37.704380
Single 35.460938
Name: Age, dtype: float64
1
2
# MaritalStatus 별 Age 평균 --> 데이터프레임
data.groupby('MaritalStatus', as_index=True)[['Age']].mean()
Age | |
---|---|
MaritalStatus | |
Divorced | 37.522727 |
Married | 37.704380 |
Single | 35.460938 |
1
2
# MaritalStatus 별 Age 평균 --> 데이터프레임
data.groupby('MaritalStatus', as_index=False)[['Age']].mean()
MaritalStatus | Age | |
---|---|---|
0 | Divorced | 37.522727 |
1 | Married | 37.704380 |
2 | Single | 35.460938 |
1
2
3
4
data_mean = data.groupby('MaritalStatus', as_index=False)[['Age']].mean()
# 확인
data_mean
MaritalStatus | Age | |
---|---|---|
0 | Divorced | 37.522727 |
1 | Married | 37.704380 |
2 | Single | 35.460938 |
여러 열 집계
1
2
3
4
data_mean = data.groupby('MaritalStatus', as_index=False)[['Age','MonthlyIncome']].mean()
# 확인
data_mean
MaritalStatus | Age | MonthlyIncome | |
---|---|---|---|
0 | Divorced | 37.522727 | 6707.018939 |
1 | Married | 37.704380 | 6880.144161 |
2 | Single | 35.460938 | 5877.794271 |
- sum() 메소드 앞에 아무 열도 지정하지 않으면 기준열 이외의 모든 열에 대한 집계가 수행됩니다.
1
2
3
4
data_sum = data.groupby('MaritalStatus', as_index=False).sum()
# 확인
data_sum
MaritalStatus | Attrition | Age | DistanceFromHome | EmployeeNumber | JobSatisfaction | MonthlyIncome | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|
0 | Divorced | 23 | 9906 | 2404 | 266305 | 716 | 1770653 | 3958 | 3106 |
1 | Married | 69 | 20662 | 5295 | 584446 | 1468 | 3770319 | 8431 | 6470 |
2 | Single | 103 | 13617 | 3374 | 387862 | 1065 | 2257073 | 5852 | 3975 |
- by=[‘feature1’, ‘feature2’] 과 같이 집계 기준 열을 여럿 설정할 수도 있습니다.
1
2
3
4
5
# 'MaritalStatus', 'Gender'별 나머지 열들 평균 조회
data_sum = data.groupby(['MaritalStatus', 'Gender'], as_index=False)[['Age','MonthlyIncome']].mean()
# 확인
data_sum
MaritalStatus | Gender | Age | MonthlyIncome | |
---|---|---|---|---|
0 | Divorced | Female | 37.010526 | 6626.315789 |
1 | Divorced | Male | 37.810651 | 6752.384615 |
2 | Married | Female | 38.774194 | 7301.493088 |
3 | Married | Male | 37.003021 | 6603.912387 |
4 | Single | Female | 35.261146 | 5963.445860 |
5 | Single | Male | 35.599119 | 5818.555066 |
Aggregation
- df.groupby( ).agg([‘함수1’,’함수2’, …])
- 여러 함수로 한꺼번에 집계
- as_index 예외 :
.agg()
를 사용하면as_index = False
해도, ~~별 칼럼이 인덱스로 들어간다.
1
2
3
data_agg = data.groupby('MaritalStatus', as_index=False)[['MonthlyIncome']].agg(['min','max','mean'])
# 확인
data_agg
MonthlyIncome | |||
---|---|---|---|
min | max | mean | |
MaritalStatus | |||
Divorced | 1129 | 19973 | 6707.018939 |
Married | 1052 | 19999 | 6880.144161 |
Single | 1009 | 19926 | 5877.794271 |
This post is licensed under CC BY 4.0 by the author.