[Pandas 기초] 3. DataFrame 조회
Python Library 중 하나인 Pandas에서 DataFrame을 조회하는 방법을 알아보자.
- 보고자 하는 데이터를 즉시 조회할 수 있도록 반복 학습과 실습을 통해 익숙해져야 함
- 데이터프레임을 대상으로 조회하는 방법은 다양하다.
- 그 중 한가지 방법을 선택해 일관되게 사용하기를 권고
1. 특정 열 조회
df.loc[:, [열 이름1, 열 이름2, ... ]]
형태로 조회할 열 이름을 리스트로 지정- 열부분은 생략할 수 있지만, 행 부분을 생략할 수는 없다.
- 하지만
df[[열 이름1, 열 이름2, ...]]
형태로 인덱서를 생략함이 일반적이다. - 조회할 열이 하나면 리스트 형태가 아니어도 된다.
1
2
# Attrition 열 조회 : 시리즈로 조회 (조금 더 권장하는 방법)
data['Attrition']
1
2
3
4
5
6
7
8
9
10
11
12
0 0
1 0
2 0
3 0
4 1
..
1191 0
1192 0
1193 0
1194 0
1195 0
Name: Attrition, Length: 1196, dtype: int64
1
2
# Attrition 열 조회2 : 시리즈로 조회 (오류 발생 가능성 있음)
data.Attrition
1
2
3
4
5
6
7
8
9
10
11
12
0 0
1 0
2 0
3 0
4 1
..
1191 0
1192 0
1193 0
1194 0
1195 0
Name: Attrition, Length: 1196, dtype: int64
1
2
3
# Attrition, Age 열 조회 : 데이터프레임으로 조회
# 대괄호 안에 리스트!!!
data[['Attrition', 'Age' ]]
Attrition | Age | |
---|---|---|
0 | 0 | 33 |
1 | 0 | 35 |
2 | 0 | 42 |
3 | 0 | 46 |
4 | 1 | 22 |
... | ... | ... |
1191 | 0 | 32 |
1192 | 0 | 27 |
1193 | 0 | 29 |
1194 | 0 | 29 |
1195 | 0 | 43 |
1196 rows × 2 columns
2. 조건으로 조회
df.loc[조건]
형태로 조건을 지정해 조건에 만족하는 데이터만 조회할 수 있다.- 우선 조건이 제대로 판단이 되는지 확인한 후, 그 조건을 대괄호 안에 넣으면 된다.
단일 조건 조회
1
2
# 조건절(조건문)의 결과는 True, False
data['DistanceFromHome'] > 10
1
2
3
4
5
6
7
8
9
10
11
12
0 False
1 True
2 False
3 False
4 False
...
1191 False
1192 True
1193 False
1194 False
1195 True
Name: DistanceFromHome, Length: 1196, dtype: bool
1
2
# DistanceFromHome 열 값이 10 보다 큰 행 조회
data.loc[data['DistanceFromHome'] > 10]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 35 | 18 | 1412 | Male | 4 | Single | 9362 | No | 11 | 10 |
5 | 0 | 24 | 21 | 1551 | Male | 1 | Divorced | 2296 | No | 14 | 2 |
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
11 | 1 | 33 | 15 | 582 | Male | 3 | Married | 13610 | Yes | 12 | 15 |
15 | 0 | 34 | 23 | 60 | Male | 3 | Single | 4568 | No | 20 | 10 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1181 | 0 | 35 | 28 | 1596 | Male | 3 | Married | 3407 | No | 17 | 10 |
1186 | 1 | 26 | 20 | 1818 | Female | 2 | Married | 2148 | Yes | 11 | 6 |
1188 | 0 | 29 | 19 | 1497 | Male | 3 | Divorced | 8620 | No | 14 | 10 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
363 rows × 11 columns
여러 조건 조회
1
2
# and로 여러 조건 연결
data.loc[(data['DistanceFromHome'] > 10) & (data['JobSatisfaction'] == 4)]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 35 | 18 | 1412 | Male | 4 | Single | 9362 | No | 11 | 10 |
50 | 0 | 29 | 15 | 346 | Male | 4 | Single | 2340 | No | 19 | 6 |
51 | 0 | 45 | 28 | 1546 | Male | 4 | Married | 2132 | No | 20 | 8 |
64 | 0 | 32 | 15 | 1955 | Female | 4 | Divorced | 6667 | No | 18 | 9 |
82 | 1 | 35 | 12 | 1667 | Male | 4 | Single | 4581 | Yes | 24 | 13 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1104 | 0 | 34 | 19 | 1701 | Female | 4 | Married | 2929 | No | 12 | 10 |
1126 | 0 | 35 | 11 | 1137 | Male | 4 | Divorced | 4968 | No | 11 | 5 |
1141 | 1 | 49 | 11 | 840 | Female | 4 | Married | 7654 | No | 18 | 9 |
1148 | 0 | 36 | 18 | 1133 | Male | 4 | Single | 7779 | No | 20 | 18 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
107 rows × 11 columns
1
2
# or 조건 : |
data.loc[(data['DistanceFromHome'] > 10) | (data['JobSatisfaction'] == 4)]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 35 | 18 | 1412 | Male | 4 | Single | 9362 | No | 11 | 10 |
5 | 0 | 24 | 21 | 1551 | Male | 1 | Divorced | 2296 | No | 14 | 2 |
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
8 | 0 | 26 | 6 | 686 | Female | 4 | Married | 2659 | Yes | 13 | 3 |
11 | 1 | 33 | 15 | 582 | Male | 3 | Married | 13610 | Yes | 12 | 15 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1186 | 1 | 26 | 20 | 1818 | Female | 2 | Married | 2148 | Yes | 11 | 6 |
1188 | 0 | 29 | 19 | 1497 | Male | 3 | Divorced | 8620 | No | 14 | 10 |
1190 | 0 | 27 | 5 | 844 | Male | 4 | Divorced | 12808 | Yes | 16 | 9 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
629 rows × 11 columns
isin()
, between()
isin([값1, 값2, ..., 값n])
: 값1 또는 값2 또는 .. 값n 인 데이터만 조회- 주의 :
isin(리스트)
값들을 리스트 형태로 입력해야 한다.
1
2
# 값 나열
data.loc[data['JobSatisfaction'].isin([1,4])]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
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 |
5 | 0 | 24 | 21 | 1551 | Male | 1 | Divorced | 2296 | No | 14 | 2 |
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1184 | 0 | 33 | 5 | 1395 | Male | 4 | Married | 9998 | No | 13 | 8 |
1185 | 0 | 24 | 10 | 1746 | Male | 4 | Married | 2145 | No | 14 | 3 |
1190 | 0 | 27 | 5 | 844 | Male | 4 | Divorced | 12808 | Yes | 16 | 9 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
616 rows × 11 columns
- 위 구문은 다음과 같은 의미를 갖는다.
1
2
# or 조건
data.loc[(data['JobSatisfaction'] == 1) | (data['JobSatisfaction'] == 4)]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
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 |
5 | 0 | 24 | 21 | 1551 | Male | 1 | Divorced | 2296 | No | 14 | 2 |
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1184 | 0 | 33 | 5 | 1395 | Male | 4 | Married | 9998 | No | 13 | 8 |
1185 | 0 | 24 | 10 | 1746 | Male | 4 | Married | 2145 | No | 14 | 3 |
1190 | 0 | 27 | 5 | 844 | Male | 4 | Divorced | 12808 | Yes | 16 | 9 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1195 | 0 | 43 | 16 | 327 | Female | 4 | Married | 16064 | Yes | 22 | 22 |
616 rows × 11 columns
between(값1, 값2)
: 값1 ~ 값2 까지 범위안의 데이터만 조회
1
2
# 범위 지정
data.loc[data['Age'].between(25, 30)]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
8 | 0 | 26 | 6 | 686 | Female | 4 | Married | 2659 | Yes | 13 | 3 |
16 | 0 | 30 | 5 | 197 | Female | 1 | Divorced | 3204 | No | 14 | 8 |
28 | 0 | 26 | 1 | 1893 | Female | 3 | Married | 2933 | Yes | 13 | 1 |
32 | 0 | 30 | 7 | 1224 | Male | 3 | Divorced | 3491 | No | 13 | 10 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1188 | 0 | 29 | 19 | 1497 | Male | 3 | Divorced | 8620 | No | 14 | 10 |
1190 | 0 | 27 | 5 | 844 | Male | 4 | Divorced | 12808 | Yes | 16 | 9 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1193 | 0 | 29 | 9 | 1558 | Male | 3 | Married | 2451 | No | 18 | 5 |
1194 | 0 | 29 | 2 | 469 | Male | 3 | Married | 4649 | No | 14 | 4 |
238 rows × 11 columns
- 위 구문은 다음과 같은 의미를 갖는다.
1
2
# and 조건
data.loc[(data['Age'] >= 25) & (data['Age'] <= 30)]
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
7 | 0 | 30 | 20 | 1084 | Male | 1 | Married | 9957 | No | 15 | 7 |
8 | 0 | 26 | 6 | 686 | Female | 4 | Married | 2659 | Yes | 13 | 3 |
16 | 0 | 30 | 5 | 197 | Female | 1 | Divorced | 3204 | No | 14 | 8 |
28 | 0 | 26 | 1 | 1893 | Female | 3 | Married | 2933 | Yes | 13 | 1 |
32 | 0 | 30 | 7 | 1224 | Male | 3 | Divorced | 3491 | No | 13 | 10 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1188 | 0 | 29 | 19 | 1497 | Male | 3 | Divorced | 8620 | No | 14 | 10 |
1190 | 0 | 27 | 5 | 844 | Male | 4 | Divorced | 12808 | Yes | 16 | 9 |
1192 | 0 | 27 | 19 | 1619 | Male | 1 | Divorced | 4066 | No | 11 | 7 |
1193 | 0 | 29 | 9 | 1558 | Male | 3 | Married | 2451 | No | 18 | 5 |
1194 | 0 | 29 | 2 | 469 | Male | 3 | Married | 4649 | No | 14 | 4 |
238 rows × 11 columns
조건을 만족하는 행의 일부 열 조회
df.loc[조건, ['열 이름1', '열 이름2', ...]]
형태로 조회할 열을 리스트로 지정 => 2차원, 데이터프레임 형태로 조회
1
2
# 조건에 맞는 하나의 열 조회
data.loc[data['MonthlyIncome'] >= 10000, ['Age']]
Age | |
---|---|
0 | 33 |
2 | 42 |
3 | 46 |
11 | 33 |
13 | 39 |
... | ... |
1157 | 42 |
1158 | 54 |
1166 | 34 |
1190 | 27 |
1195 | 43 |
230 rows × 1 columns
1
2
# 조건에 맞는 여러 열 조회
data.loc[data['MonthlyIncome'] >= 10000, ['Age', 'MaritalStatus', 'TotalWorkingYears']]
Age | MaritalStatus | TotalWorkingYears | |
---|---|---|---|
0 | 33 | Married | 14 |
2 | 42 | Married | 18 |
3 | 46 | Married | 28 |
11 | 33 | Married | 15 |
13 | 39 | Single | 21 |
... | ... | ... | ... |
1157 | 42 | Single | 24 |
1158 | 54 | Married | 36 |
1166 | 34 | Single | 14 |
1190 | 27 | Divorced | 9 |
1195 | 43 | Married | 22 |
230 rows × 3 columns
연습문제
- MaritalStatus 가 Single 이고, 나이가 30~40 인 직원을 월급순으로 정렬 (내림차순)
1
data.loc[(data['MaritalStatus'] == 'Single') & (data['Age'].between(30, 40))].sort_values(['MonthlyIncome'], ascending=False)
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
1092 | 0 | 40 | 7 | 1740 | Male | 2 | Single | 19833 | No | 14 | 21 |
467 | 0 | 40 | 14 | 1128 | Male | 3 | Single | 19626 | No | 14 | 21 |
13 | 0 | 39 | 9 | 2022 | Male | 4 | Single | 19431 | No | 13 | 21 |
265 | 0 | 31 | 8 | 1430 | Female | 2 | Single | 16422 | No | 11 | 9 |
420 | 0 | 40 | 9 | 1166 | Female | 3 | Single | 13499 | No | 17 | 20 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
46 | 0 | 36 | 3 | 238 | Male | 2 | Single | 2088 | No | 12 | 13 |
568 | 0 | 36 | 7 | 1659 | Male | 2 | Single | 2013 | No | 11 | 15 |
26 | 1 | 32 | 2 | 1692 | Male | 2 | Single | 1393 | No | 12 | 1 |
301 | 1 | 31 | 8 | 1433 | Female | 2 | Single | 1261 | No | 12 | 1 |
1118 | 1 | 30 | 9 | 1876 | Male | 4 | Single | 1081 | No | 13 | 1 |
175 rows × 11 columns
기타
[1] loc와 iloc
loc
는 index 이름,iloc
는 index number 기준으로 탐색
1
2
s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
s.loc[:3]
1
2
3
4
5
6
7
8
9
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
dtype: float64
1
s.iloc[:3]
1
2
3
4
49 NaN
48 NaN
47 NaN
dtype: float64
[2] isnull()
- column 또는 row 값의 NaN(null) 값의 index를 반환함
1
data.isnull().head()
Attrition | Age | DistanceFromHome | EmployeeNumber | Gender | JobSatisfaction | MaritalStatus | MonthlyIncome | OverTime | PercentSalaryHike | TotalWorkingYears | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | False | False | False | False | False | False | False | False | False |
1 | False | False | False | False | False | False | False | False | False | False | False |
2 | False | False | False | False | False | False | False | False | False | False | False |
3 | False | False | False | False | False | False | False | False | False | False | False |
4 | False | False | False | False | False | False | False | False | False | False | False |
1
data.isnull().sum()
1
2
3
4
5
6
7
8
9
10
11
12
Attrition 0
Age 0
DistanceFromHome 0
EmployeeNumber 0
Gender 0
JobSatisfaction 0
MaritalStatus 0
MonthlyIncome 0
OverTime 0
PercentSalaryHike 0
TotalWorkingYears 0
dtype: int64
[3] 기타 메소드
df.T
: Transposedf.values
: 값 출력df.to_csv()
: csv 변환del df["debt"]
: column 삭제df.cumsum()
: 누적 합df.cummax()
: 누적 최대df.cummin()
: 누적 최소
This post is licensed under CC BY 4.0 by the author.