[Pandas 기초] 2. DataFrame 탐색
Python Library 중 하나인 Pandas에서 DataFrame을 탐색하는 방법을 알아보자.
- 파일에서 불러온 데이터의 크기, 내용, 분포, 누락된 값 등을 확인
- 확인된 내용을 통해 데이터 전처리 필요 여부를 결정
- 데이터를 알아야 데이터를 분석할 수 있다!
[참고] 자주 사용할 만한 메서드들
- head(): 상위 데이터 확인
- tail(): 하위 데이터 확인
- shape: 데이터프레임 크기
- index: 인덱스 정보 확인
- values: 값 정보 확인
- columns: 열 정보 확인
- dtypes: 열 자료형 확인
- info(): 열에 대한 상세한 정보 확인
- describe(): 기초통계정보 확인
1. 상위, 하위 일부 데이터, 크기 확인
head(n)
,tail(n)
메소드를 사용해 앞 뒤 데이터를 확인- 개수를 지정하지 않으면 기본적으로 5개 행이 조회 됨
상위 데이터 확인
1
data.head()
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
data.tail(3)
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
1193 | 0 | 29 | 9 | 1558 | Male | 3 | Married | 2451 | No | 18 | 5 |
1194 | 0 | 29 | 2 | 469 | Male | 3 | Married | 4649 | No | 14 | 4 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
크기 확인 .shape
- (rows, cols) 값을 갖는 튜플 형태로 확인이 가능
- 데이터를 분석할 때 처리할 데이터 양을 확인하는 목적으로 많이 사용
1
data.shape
1
(1196, 11)
2. 열, 행 정보 보기
열 확인
1
2
3
print(data.columns)
print()
print(data.columns.values) # np array 형태
1
2
3
4
5
6
7
8
Index(['Attrition', 'Age', 'DistanceFromHome', 'EmployeeNumber', 'Gender',
'JobSatisfaction', 'MaritalStatus', 'MonthlyIncome', 'OverTime',
'PercentSalaryHike', 'TotalWorkingYears'],
dtype='object')
['Attrition' 'Age' 'DistanceFromHome' 'EmployeeNumber' 'Gender'
'JobSatisfaction' 'MaritalStatus' 'MonthlyIncome' 'OverTime'
'PercentSalaryHike' 'TotalWorkingYears']
1
2
# 데이터프레임을 리스트 함수에 넣으면 열 이름이 리스트로 반환됨.
list(data)
1
2
3
4
5
6
7
8
9
10
11
['Attrition',
'Age',
'DistanceFromHome',
'EmployeeNumber',
'Gender',
'JobSatisfaction',
'MaritalStatus',
'MonthlyIncome',
'OverTime',
'PercentSalaryHike',
'TotalWorkingYears']
자료형 확인
- int64: 정수형 데이터(int)
- float64: 실수형 데이터(float)
- object: 문자열 데이터(string)
1
data.dtypes
1
2
3
4
5
6
7
8
9
10
11
12
Attrition int64
Age int64
DistanceFromHome int64
EmployeeNumber int64
Gender object
JobSatisfaction int64
MaritalStatus object
MonthlyIncome int64
OverTime object
PercentSalaryHike int64
TotalWorkingYears int64
dtype: object
1
2
# 열 자료형, 값 개수 확인
data.info()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1196 entries, 0 to 1195
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Attrition 1196 non-null int64
1 Age 1196 non-null int64
2 DistanceFromHome 1196 non-null int64
3 EmployeeNumber 1196 non-null int64
4 Gender 1196 non-null object
5 JobSatisfaction 1196 non-null int64
6 MaritalStatus 1196 non-null object
7 MonthlyIncome 1196 non-null int64
8 OverTime 1196 non-null object
9 PercentSalaryHike 1196 non-null int64
10 TotalWorkingYears 1196 non-null int64
dtypes: int64(8), object(3)
memory usage: 102.9+ KB
기초통계정보 확인
- describe() 메소드는 데이터에 대한 많은 정보를 제공하는 매우 중요한 메소드이다.
- 개수(count), 평균(mean), 표준편차(std), 최솟값(min), 사분위값(25%, 50%, 75%), 최댓값(max)을 표시한다.
1
data.describe()
Attrition | Age | DistanceFromHome | EmployeeNumber | JobSatisfaction | MonthlyIncome | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|
count | 1196.000000 | 1196.00000 | 1196.000000 | 1196.000000 | 1196.000000 | 1196.000000 | 1196.000000 | 1196.000000 |
mean | 0.163043 | 36.94398 | 9.258361 | 1035.629599 | 2.716555 | 6520.104515 | 15.251672 | 11.330268 |
std | 0.369560 | 9.09270 | 8.166016 | 604.340130 | 1.110962 | 4665.902253 | 3.625946 | 7.823821 |
min | 0.000000 | 18.00000 | 1.000000 | 1.000000 | 1.000000 | 1009.000000 | 11.000000 | 0.000000 |
25% | 0.000000 | 30.00000 | 2.000000 | 507.750000 | 2.000000 | 2928.250000 | 12.000000 | 6.000000 |
50% | 0.000000 | 36.00000 | 7.000000 | 1028.000000 | 3.000000 | 4973.500000 | 14.000000 | 10.000000 |
75% | 0.000000 | 43.00000 | 14.000000 | 1581.250000 | 4.000000 | 8420.500000 | 18.000000 | 15.000000 |
max | 1.000000 | 60.00000 | 29.000000 | 2068.000000 | 4.000000 | 19999.000000 | 25.000000 | 40.000000 |
- 일부 열에 대해서만 기초통계정보를 확인할 수 있다.
1
print(data[['Age', 'MonthlyIncome']].describe())
1
2
3
4
5
6
7
8
9
Age MonthlyIncome
count 1196.00000 1196.000000
mean 36.94398 6520.104515
std 9.09270 4665.902253
min 18.00000 1009.000000
25% 30.00000 2928.250000
50% 36.00000 4973.500000
75% 43.00000 8420.500000
max 60.00000 19999.000000
3. 정렬해서 보기
- 인덱스를 기준으로 정렬하는 방법과 특정 열을 기준으로 정렬하는 방법이 있다.
- sort_values() 메소드로 특정 열을 기준으로 정렬.
- ascending 옵션을 설정해 오름차순, 내림차순을 설정할 수 있다.
- ascending=True: 오름차순 정렬(기본값)
- ascending=False: 내림차순 정렬
1
data.sort_values(by='MonthlyIncome', ascending=False)
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
240 | 0 | 52 | 1 | 259 | Male | 3 | Married | 19999 | No | 14 | 34 |
234 | 0 | 41 | 7 | 1035 | Female | 3 | Divorced | 19973 | No | 22 | 21 |
322 | 0 | 56 | 4 | 1191 | Female | 1 | Divorced | 19943 | No | 13 | 28 |
530 | 0 | 50 | 11 | 226 | Female | 2 | Single | 19926 | No | 15 | 21 |
532 | 1 | 55 | 2 | 787 | Male | 1 | Married | 19859 | Yes | 13 | 24 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
150 | 1 | 29 | 24 | 1928 | Male | 1 | Single | 1091 | No | 17 | 1 |
1118 | 1 | 30 | 9 | 1876 | Male | 4 | Single | 1081 | No | 13 | 1 |
709 | 0 | 28 | 10 | 1056 | Male | 2 | Married | 1052 | No | 22 | 1 |
862 | 0 | 18 | 5 | 1012 | Male | 4 | Single | 1051 | No | 15 | 0 |
91 | 1 | 20 | 10 | 701 | Male | 3 | Single | 1009 | Yes | 11 | 1 |
1196 rows × 11 columns
1
2
# 복합 열 정렬
data.sort_values(by=['JobSatisfaction', 'MonthlyIncome'], ascending=[True, False])
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
322 | 0 | 56 | 4 | 1191 | Female | 1 | Divorced | 19943 | No | 13 | 28 |
532 | 1 | 55 | 2 | 787 | Male | 1 | Married | 19859 | Yes | 13 | 24 |
273 | 0 | 58 | 1 | 1423 | Female | 1 | Married | 19701 | Yes | 21 | 32 |
418 | 0 | 60 | 7 | 549 | Female | 1 | Married | 19566 | No | 11 | 33 |
685 | 0 | 54 | 5 | 522 | Male | 1 | Married | 19406 | No | 11 | 24 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
197 | 0 | 31 | 2 | 1974 | Female | 4 | Divorced | 1129 | Yes | 11 | 1 |
386 | 1 | 25 | 24 | 1273 | Male | 4 | Single | 1118 | Yes | 14 | 1 |
684 | 1 | 19 | 2 | 243 | Male | 4 | Single | 1102 | No | 22 | 1 |
1118 | 1 | 30 | 9 | 1876 | Male | 4 | Single | 1081 | No | 13 | 1 |
862 | 0 | 18 | 5 | 1012 | Male | 4 | Single | 1051 | No | 15 | 0 |
1196 rows × 11 columns
1
2
3
# 복합 열 정렬 : 별도로 저장하고, 인덱스 reset
temp = data.sort_values(by=['JobSatisfaction', 'MonthlyIncome'], ascending=[True, False])
temp.reset_index(drop = True)
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 56 | 4 | 1191 | Female | 1 | Divorced | 19943 | No | 13 | 28 |
1 | 1 | 55 | 2 | 787 | Male | 1 | Married | 19859 | Yes | 13 | 24 |
2 | 0 | 58 | 1 | 1423 | Female | 1 | Married | 19701 | Yes | 21 | 32 |
3 | 0 | 60 | 7 | 549 | Female | 1 | Married | 19566 | No | 11 | 33 |
4 | 0 | 54 | 5 | 522 | Male | 1 | Married | 19406 | No | 11 | 24 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1191 | 0 | 31 | 2 | 1974 | Female | 4 | Divorced | 1129 | Yes | 11 | 1 |
1192 | 1 | 25 | 24 | 1273 | Male | 4 | Single | 1118 | Yes | 14 | 1 |
1193 | 1 | 19 | 2 | 243 | Male | 4 | Single | 1102 | No | 22 | 1 |
1194 | 1 | 30 | 9 | 1876 | Male | 4 | Single | 1081 | No | 13 | 1 |
1195 | 0 | 18 | 5 | 1012 | Male | 4 | Single | 1051 | No | 15 | 0 |
1196 rows × 11 columns
4. 기본 집계
고유값 확인
unique()
메소드로 고유값을 확인하며, 결과값은 배열 형태
1
2
# MaritalStatus 열 고유값 확인
print(data['MaritalStatus'].unique())
1
['Married' 'Single' 'Divorced']
고유값과 개수 확인
- value_counts() 메소드로 고유값과 그 개수를 확인하며, 결과값은 시리즈 형태
1
2
# MaritalStatus 열 고유값 개수 확인
print(data['MaritalStatus'].value_counts())
1
2
3
4
Married 548
Single 384
Divorced 264
Name: MaritalStatus, dtype: int64
기본 집계 메소드 사용
- 데이터를 1차 집계 한 후 분석을 진행하는 경우가 많으므로 필히 알아두어야 하는 내용
- 이후에 배우는 Groupby 기능에서 같이 사용됨
1
2
# MonthlyIncome 열 합계 조회
print(data['MonthlyIncome'].sum())
1
7798045
1
2
# MonthlyIncome 열 최댓값 조회
print(data['MonthlyIncome'].max())
1
19999
1
2
# 'Age', 'MonthlyIncome' 열 평균값 확인
print(data[['Age', 'MonthlyIncome']].mean())
1
2
3
Age 36.943980
MonthlyIncome 6520.104515
dtype: float64
1
2
# 'Age', 'MonthlyIncome' 열 중앙값 확인
print(data[['Age', 'MonthlyIncome']].median())
1
2
3
Age 36.0
MonthlyIncome 4973.5
dtype: float64
This post is licensed under CC BY 4.0 by the author.