저번글에 이어서 이번에는 DataFrame 위주로 공부해 보겠습니다. DataFrame이란 Series가 모여있는 집합으로 생각하셔도 되고, 엑셀로 생각하셔도 됩니다. 아래 간단한 예시를 들어 보겠습니다.
import numpy as np
import pandas as pd
sub = {"국어":(18,38,79,54,97,10,60,72,86),
"수학":np.array([97,18,20,67,14,38,80,34,94]),
"영어":np.array((70,80,37,94,54,10,34,87,37)),
"Python":[71,37,97,28,34,87,80,34,87],
"C++":[17,65,26,75,35,34,65,32,17]
}
person = ["A","B",'C','D','E','F','G','H','I']
# df : dataframe
df = pd.DataFrame(sub,index = person)
df
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | 18 | 97 | 70 | 71 | 17 |
B | 38 | 18 | 80 | 37 | 65 |
C | 79 | 20 | 37 | 97 | 26 |
D | 54 | 67 | 94 | 28 | 75 |
E | 97 | 14 | 54 | 34 | 35 |
F | 10 | 38 | 10 | 87 | 34 |
G | 60 | 80 | 34 | 80 | 65 |
H | 72 | 34 | 87 | 34 | 32 |
I | 86 | 94 | 37 | 87 | 17 |
위의 표의 각 열은 과목명을 나타내며, 행은 사람을 나타낸다고 가정합니다. 그렇게해서 위와같은 표를 만들수 있고 해당 dataframe을 출력한 모습입니다. dataframe을 만들때는 pd.DataFrame 이라는 함수를 사용하며 그 내용은 dictionary타입으로 넣어줍니다. 그렇게되면 dictionary의 key가 열의 이름으로, value가 내용으로 들어갑니다. 이때 value의 값은 list 또는 tuple, np.array 가 될 수 있습니다.
df.index, df.columns 를 통해서 각 행,열의 이름을 알 수 있습니다.
df.index
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'], dtype='object')
df.index[0],df.index[3],df.index[7],df.index[-1]
('A', 'D', 'H', 'I')
df.columns
Index(['국어', '수학', '영어', 'Python', 'C++'], dtype='object')
df.columns[1],df.columns[3]
('수학', 'Python')
df.values를 이용해서 해당 dataframe의 contents만 뽑아낼 수 있는데, 매우 자주쓰는 방법입니다. csv로된 파일을 pandas를 통해서 읽은 후, 머신러닝이나 딥러닝 모듈을 이용해야할때 주로 사용합니다.
df.values
array([[18, 97, 70, 71, 17], [38, 18, 80, 37, 65], [79, 20, 37, 97, 26], [54, 67, 94, 28, 75], [97, 14, 54, 34, 35], [10, 38, 10, 87, 34], [60, 80, 34, 80, 65], [72, 34, 87, 34, 32], [86, 94, 37, 87, 17]], dtype=int64)
type(df.values)
numpy.ndarray
csv로 된 dataframe을 읽으면 일반적으로 행의 개수는 굉장히 많습니다. 그래서 데이터구조를 파악하기 위해 상위 몇개 또는 하위 몇개의 데이터를 읽어야할 경우가 종종 있는데 이때 head,tail method를 사용합니다.
df.head(3)
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | 18 | 97 | 70 | 71 | 17 |
B | 38 | 18 | 80 | 37 | 65 |
C | 79 | 20 | 37 | 97 | 26 |
df.tail(4)
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
F | 10 | 38 | 10 | 87 | 34 |
G | 60 | 80 | 34 | 80 | 65 |
H | 72 | 34 | 87 | 34 | 32 |
I | 86 | 94 | 37 | 87 | 17 |
행을 가져오려면 loc method를 사용합니다.
df.loc["A"]
국어 18 수학 97 영어 70 Python 71 C++ 17 Name: A, dtype: int64
df.loc["C"]
국어 79 수학 20 영어 37 Python 97 C++ 26 Name: C, dtype: int64
df.loc["H"]
국어 72 수학 34 영어 87 Python 34 C++ 32 Name: H, dtype: int64
특정 열을 가져오려면 df [ ] 식으로 가져오면 됩니다.
df["국어"]
A 18 B 38 C 79 D 54 E 97 F 10 G 60 H 72 I 86 Name: 국어, dtype: int64
df["Python"]
A 71 B 37 C 97 D 28 E 34 F 87 G 80 H 34 I 87 Name: Python, dtype: int64
특정 행 또는 열을 index를 통해서 가져오려면 iloc를 사용하면 됩니다.
df.iloc[0]
국어 18 수학 97 영어 70 Python 71 C++ 17 Name: A, dtype: int64
df.iloc[3,4]
75
df.iloc[1:3,2:]
영어 | Python | C++ | |
---|---|---|---|
B | 80 | 37 | 65 |
C | 37 | 97 | 26 |
,<,>=,<=,== 을 통해서 dataframe을 비교할 수 있습니다.
df>0
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | True | True | True | True | True |
B | True | True | True | True | True |
C | True | True | True | True | True |
D | True | True | True | True | True |
E | True | True | True | True | True |
F | True | True | True | True | True |
G | True | True | True | True | True |
H | True | True | True | True | True |
I | True | True | True | True | True |
df>50
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | False | True | True | True | False |
B | False | False | True | False | True |
C | True | False | False | True | False |
D | True | True | True | False | True |
E | True | False | True | False | False |
F | False | False | False | True | False |
G | True | True | False | True | True |
H | True | False | True | False | False |
I | True | True | False | True | False |
위 방법을 응용하여 데이터를 필터링 하는 방법을 알아보겠습니다.
국어 점수가 50점 이상인 학생의 성적 보기
df[df["국어"]>=50]
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
C | 79 | 20 | 37 | 97 | 26 |
D | 54 | 67 | 94 | 28 | 75 |
E | 97 | 14 | 54 | 34 | 35 |
G | 60 | 80 | 34 | 80 | 65 |
H | 72 | 34 | 87 | 34 | 32 |
I | 86 | 94 | 37 | 87 | 17 |
C++점수가 80점 이하인 학생의 성적 보기
df[df["C++"]<=80]
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | 18 | 97 | 70 | 71 | 17 |
B | 38 | 18 | 80 | 37 | 65 |
C | 79 | 20 | 37 | 97 | 26 |
D | 54 | 67 | 94 | 28 | 75 |
E | 97 | 14 | 54 | 34 | 35 |
F | 10 | 38 | 10 | 87 | 34 |
G | 60 | 80 | 34 | 80 | 65 |
H | 72 | 34 | 87 | 34 | 32 |
I | 86 | 94 | 37 | 87 | 17 |
조건을 2개 걸어보겠습니다. 파이썬 점수가 50 초과, C++점수가 30 초과 인 학생을 필터링
df[(df["Python"]>50) & (df["C++"]>30)]
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
F | 10 | 38 | 10 | 87 | 34 |
G | 60 | 80 | 34 | 80 | 65 |
조건을 만족하는 행 변경
df[(df['Python']>50)]="Pass"
df
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | Pass | Pass | Pass | Pass | Pass |
B | 38 | 18 | 80 | 37 | 65 |
C | Pass | Pass | Pass | Pass | Pass |
D | 54 | 67 | 94 | 28 | 75 |
E | 97 | 14 | 54 | 34 | 35 |
F | Pass | Pass | Pass | Pass | Pass |
G | Pass | Pass | Pass | Pass | Pass |
H | 72 | 34 | 87 | 34 | 32 |
I | Pass | Pass | Pass | Pass | Pass |
df["Python"][(df['Python']>50)]="Pass"
df
<ipython-input-25-4423de6c7d92>:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df["Python"][(df['Python']>50)]="Pass"
국어 | 수학 | 영어 | Python | C++ | |
---|---|---|---|---|---|
A | 18 | 97 | 70 | Pass | 17 |
B | 38 | 18 | 80 | 37 | 65 |
C | 79 | 20 | 37 | Pass | 26 |
D | 54 | 67 | 94 | 28 | 75 |
E | 97 | 14 | 54 | 34 | 35 |
F | 10 | 38 | 10 | Pass | 34 |
G | 60 | 80 | 34 | Pass | 65 |
H | 72 | 34 | 87 | 34 | 32 |
I | 86 | 94 | 37 | Pass | 17 |
Pandas_3 (0) | 2021.06.24 |
---|---|
Pandas_1 (0) | 2021.06.18 |
Numpy_2 (0) | 2021.06.14 |
Numpy_1 (0) | 2021.06.11 |
댓글 영역