728x90
Pandas 란?
- 파이썬에서 데이터를 쉽게 다룰수 있는 라이브러리
- 2차원형태의 데이터에 대해 집계,전처리 등을 아주 쉽게 할수 있다.
- 정형데이터를 다루는 라이브러리
Pandas 의 데이터구조
- Dataframe
- 2차원구조로 되어있는 행렬 데이터
- Series
- 1차원 구조로 되어있는 한종류의 열방향 데이터
- Series 여러개 모이면 Dataframe 된다.
import numpy as np
import pandas as pd
파이썬 pandas를 numpy와 함께 자주 쓰인다.
- Dataframe 만들기
- 행렬 구조의 리스트를 Dataframe 으로 변환하기
data = [
["A군",30,170],
["B군",25,180]
]
df = pd.DataFrame(data,columns = ["이름","나 이","키"])
df
=>
이름 나 이 키
0 A군 30 170
1 B군 25 180
데이터 불러오기
df["이름"]
=>
0 A군
1 B군
Name: 이름, dtype: object
컬럼명 설정
arr = np.load("samsung_stock_2021.npy")
columns = ["시작가","상한가","하한가","종가"]
pd.DataFrame(arr,columns=columns)
=>
시작가 상한가 하한가 종가
0 81000 84400 80200 83000
1 81600 83900 81600 83900
2 83300 84500 82100 82200
3 82800 84200 82700 82900
4 83300 90000 83000 88800
... ... ... ... ...
243 80200 80800 80200 80500
244 80600 80600 79800 80200
245 80200 80400 79700 80300
246 80200 80200 78500 78800
247 78900 79500 78100 78300
248 rows × 4 columns
- 딕셔너리를 이용해서 DataFrame 만들기
data = {
"이름" : ["A군","B군","C군"],
"나이" : [35,33,28],
"키" : [180.1,175.5,170.0]
}
pd.DataFrame(data)
=>
이름 나이 키
0 A군 35 180.1
1 B군 33 175.5
2 C군 28 170.0
CSV 파일 불러오기
from google.colab import drive
drive.mount('/content/drive')
DATA_PATH = "/content/drive/MyDrive/data/"
pymysql을 설치한다.
!pip install pymysql
=>
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Requirement already satisfied: pymysql in /usr/local/lib/python3.7/dist-packages (1.0.2)
- DB 접속 정보 파일 불러오기
import yaml
DB_INFO = f"{DATA_PATH}db.yaml"
with open(DB_INFO,'r') as f:
db_info = yaml.load(f,Loader=yaml.Loader)
db_info
=>
{'HOST': 'database-2.cmgtanjbjaag.ap-northeast-2.rds.amazonaws.com',
'USER': 'user11',
'PASSWD': 'user1112#$'}
- pymysql 을 이용하여 DB 연결객체 생성하기
import pymysql
conn = pymysql.connect(
user = db_info["USER"],
passwd = db_info["PASSWD"],
host = db_info["HOST"],
port = 3306,
db = "playdata"
)
conn
=>
<pymysql.connections.Connection at 0x7f7eae122b10>
- sql 을 이용하여 DB의 테이블을 데이터프레임 객체로 변환하기
df = pd.read_sql("select * from titanic_raw",conn)
df
=>
passengerid survived pclass name gender age sibsp parch ticket fare cabin embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 None S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 None S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 None S
... ... ... ... ... ... ... ... ... ... ... ... ...
1304 1305 0 3 Spector, Mr. Woolf male NaN 0 0 A.5. 3236 8.0500 None S
1305 1306 1 1 Oliva y Ocana, Dona. Fermina female 39.0 0 0 PC 17758 108.9000 C105 C
1306 1307 0 3 Saether, Mr. Simon Sivertsen male 38.5 0 0 SOTON/O.Q. 3101262 7.2500 None S
1307 1308 0 3 Ware, Mr. Frederick male NaN 0 0 359309 8.0500 None S
1308 1309 0 3 Peter, Master. Michael J male NaN 1 1 2668 22.3583 None C
- to_csv 메소드
- Dataframe을 csv 파일로 저장
df.to_csv(f"{DATA_PATH}titanic.csv",index=False) # 인덱스를 만듦!
- read_csv 함수
- csv 파일을 읽어 드려서 Dataframe 객체로 변환한다.
df = pd.read_csv(f"{DATA_PATH}titanic.csv")
df
=>
passengerid survived pclass name gender age sibsp parch ticket fare cabin embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
1304 1305 0 3 Spector, Mr. Woolf male NaN 0 0 A.5. 3236 8.0500 NaN S
1305 1306 1 1 Oliva y Ocana, Dona. Fermina female 39.0 0 0 PC 17758 108.9000 C105 C
1306 1307 0 3 Saether, Mr. Simon Sivertsen male 38.5 0 0 SOTON/O.Q. 3101262 7.2500 NaN S
1307 1308 0 3 Ware, Mr. Frederick male NaN 0 0 359309 8.0500 NaN S
1308 1309 0 3 Peter, Master. Michael J male NaN 1 1 2668 22.3583 NaN C
데이터프레임 기초 정보 확인하기
-컬럼명 확인
df.columns
=>
Index(['passengerid', 'survived', 'pclass', 'name', 'gender', 'age', 'sibsp',
'parch', 'ticket', 'fare', 'cabin', 'embarked'],
dtype='object')
df.columns.tolist()
=>
['passengerid',
'survived',
'pclass',
'name',
'gender',
'age',
'sibsp',
'parch',
'ticket',
'fare',
'cabin',
'embarked']
- 데이터 프레임 정보 확인하기
df.info(verbose=True,null_counts=True) # 열 정보가 많아 다 표시하기 위해 verbose
=>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 passengerid 1309 non-null int64
1 survived 1309 non-null int64
2 pclass 1309 non-null int64
3 name 1309 non-null object
4 gender 1309 non-null object
5 age 1046 non-null float64
6 sibsp 1309 non-null int64
7 parch 1309 non-null int64
8 ticket 1309 non-null object
9 fare 1308 non-null float64
10 cabin 295 non-null object
11 embarked 1307 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 122.8+ KB
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: FutureWarning: null_counts is deprecated. Use show_counts instead
"""Entry point for launching an IPython kernel.
- 수치형 컬럼에 대한 요약 통계 보기
df.describe()
=>
passengerid survived pclass age sibsp parch fare
count 1309.000000 1309.000000 1309.000000 1046.000000 1309.000000 1309.000000 1308.000000
mean 655.000000 0.377387 2.294882 29.881138 0.498854 0.385027 33.295479
std 378.020061 0.484918 0.837836 14.413493 1.041658 0.865560 51.758668
min 1.000000 0.000000 1.000000 0.170000 0.000000 0.000000 0.000000
25% 328.000000 0.000000 2.000000 21.000000 0.000000 0.000000 7.895800
50% 655.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 982.000000 1.000000 3.000000 39.000000 1.000000 0.000000 31.275000
max 1309.000000 1.000000 3.000000 80.000000 8.000000 9.000000 512.329200
데이터프레임 다루기
- copy 메소드
- 데이터프레임을 복사한다.
- 기본적으로 깊은 복사
df_cp = df.copy()
df_cp.head()
=> 깊은 복사 완료!
컬럼명 변경하기
cols = df_cp.columns.tolist()
cols[0] = "pid"
cols
=>
['pid',
'survived',
'pclass',
'name',
'gender',
'age',
'sibsp',
'parch',
'ticket',
'fare',
'cabin',
'embarked']
- rename 메소드
- 지정한 컬럼명들을 변경할수 있다.
- 딕셔너리 형태로 전달하면 된다.
- key는 변경전 컬럼이름
- value는 변경후 컬럼이름
cols_rename = {
"survived" : "target"
}
df = df.rename(columns = cols_rename)
df.head()
=> survived가 target으로 변경됨!
- add_prefix
- 컬럼명 앞부분에 공통된 문자열 붙혀주기
df.add_prefix("pre_")
=> 모든 컬럼에 pre_가 붙음
- add_suffix
- 컬럼명 뒷부분에 공통된 문자열 붙혀주기
df.add_suffix("_suf")
=> 모든 컬럼명 뒤 에 _suf가 붙음!
- 특정 컬럼들만 선택하기
cols = ["name","gender","age"]
df[cols].head()
=>
name gender age
0 Braund, Mr. Owen Harris male 22.0
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0
2 Heikkinen, Miss. Laina female 26.0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0
4 Allen, Mr. William Henry male 35.0
컬럼 삭제하기
- drop 메소드
# axis 를 이용한 방법
df.drop("name",axis=1) # drop의 메소드 특징으로 안사라진다!
=>
passengerid target pclass gender age sibsp parch ticket fare cabin embarked
0 1 0 3 male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 male 35.0 0 0 373450 8.0500 NaN S
... ... ... ... ... ... ... ... ... ... ... ...
1304 1305 0 3 male NaN 0 0 A.5. 3236 8.0500 NaN S
1305 1306 1 1 female 39.0 0 0 PC 17758 108.9000 C105 C
1306 1307 0 3 male 38.5 0 0 SOTON/O.Q. 3101262 7.2500 NaN S
1307 1308 0 3 male NaN 0 0 359309 8.0500 NaN S
1308 1309 0 3 male NaN 1 1 2668 22.3583 NaN C
1309 rows × 11 columns
- 컬럼 추가하기
df["target"] = target
df.head()
=>
passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
0 1 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 0
1 2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 1
2 3 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 1
3 4 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 1
4 5 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 0
컬럼 기준으로 데이터 정렬하기
- 기본은 오름차순
df.sort_values(by="age") # 오름차순
df.sort_values(by = "age" , ascending=False) # 내림차순
- 데이터 프레임 섞기
- frac: 섞은 후에 반환할 비율을 0~1사이에 값을 넣으면 된다.
df2 = df.sample(frac=1,random_state=42)
df2
=>
passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
1148 1149 3 Niklasson, Mr. Samuel male 28.0 0 0 363611 8.0500 NaN S 0
1049 1050 1 Borebank, Mr. John James male 42.0 0 0 110489 26.5500 D22 S 0
982 983 3 Pedersen, Mr. Olaf male NaN 0 0 345498 7.7750 NaN S 0
808 809 2 Meyer, Mr. August male 39.0 0 0 248723 13.0000 NaN S 0
1195 1196 3 McCarthy, Miss. Catherine Katie"" female NaN 0 0 383123 7.7500 NaN Q 1
... ... ... ... ... ... ... ... ... ... ... ... ...
1095 1096 2 Andrew, Mr. Frank Thomas male 25.0 0 0 C.A. 34050 10.5000 NaN S 0
1130 1131 1 Douglas, Mrs. Walter Donald (Mahala Dutton) female 48.0 1 0 PC 17761 106.4250 C86 C 1
1294 1295 1 Carrau, Mr. Jose Pedro male 17.0 0 0 113059 47.1000 NaN S 0
860 861 3 Hansen, Mr. Claus Peter male 41.0 2 0 350026 14.1083 NaN S 0
1126 1127 3 Vendel, Mr. Olof Edvin male 20.0 0 0 350416 7.8542 NaN S 0
1309 rows × 12 columns
행렬 다루기
- 데이터프레임에는 행에 대한 이름을 index라고 하고, 열에 대한 이름을 column 이라 한다.
- 데이터프레임도 numpy 기반으로 돌아가기 때문에, 행번호와 열번호가 있다.
- iloc
- 행번호, 열번호를 이용한 행렬 슬라이싱
- loc[0],iloc[0]의 차이점은 loc는 전체 프레임에서 인덱스 이름이 0인 행만 출력하고, iloc[0] 전체 프레임에서 0번쨰 행에 있는 값들만 추출해라!
예시
num_rows = [1,3]
num_cols = [0,4,5]
df2.iloc[num_rows,num_cols]
=>
passengerid age sibsp
1049 1050 42.0 0
808 809 39.0 0
- loc
- index 명과 column 명을 이용한 슬라이싱
- 마스킹이용한 행과 열 선택이 가능하다.
예시
df.loc[:3] # end 번호까지 포함
=>
passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
0 1 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 0
1 2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 1
2 3 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 1
3 4 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 1
- reset_index 메소드
- 인덱스를 새로 생성한다.
인덱스를 컬럼으로 옮겨 사용한다.
df2.reset_index()
=>
index passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
0 1148 1149 3 Niklasson, Mr. Samuel male 28.0 0 0 363611 8.0500 NaN S 0
1 1049 1050 1 Borebank, Mr. John James male 42.0 0 0 110489 26.5500 D22 S 0
2 982 983 3 Pedersen, Mr. Olaf male NaN 0 0 345498 7.7750 NaN S 0
3 808 809 2 Meyer, Mr. August male 39.0 0 0 248723 13.0000 NaN S 0
4 1195 1196 3 McCarthy, Miss. Catherine Katie"" female NaN 0 0 383123 7.7500 NaN Q 1
... ... ... ... ... ... ... ... ... ... ... ... ... ...
1304 1095 1096 2 Andrew, Mr. Frank Thomas male 25.0 0 0 C.A. 34050 10.5000 NaN S 0
1305 1130 1131 1 Douglas, Mrs. Walter Donald (Mahala Dutton) female 48.0 1 0 PC 17761 106.4250 C86 C 1
1306 1294 1295 1 Carrau, Mr. Jose Pedro male 17.0 0 0 113059 47.1000 NaN S 0
1307 860 861 3 Hansen, Mr. Claus Peter male 41.0 2 0 350026 14.1083 NaN S 0
1308 1126 1127 3 Vendel, Mr. Olof Edvin male 20.0 0 0 350416 7.8542 NaN S 0
1309 rows × 13 columns
df2 = df2.reset_index(drop=True) # 기존 인덱스를 삭제하면서 새로운 인덱스 생성
df2.head()
=>
passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
0 1149 3 Niklasson, Mr. Samuel male 28.0 0 0 363611 8.050 NaN S 0
1 1050 1 Borebank, Mr. John James male 42.0 0 0 110489 26.550 D22 S 0
2 983 3 Pedersen, Mr. Olaf male NaN 0 0 345498 7.775 NaN S 0
3 809 2 Meyer, Mr. August male 39.0 0 0 248723 13.000 NaN S 0
4 1196 3 McCarthy, Miss. Catherine Katie"" female NaN 0 0 383123 7.750 NaN Q 1
- 마스킹을 이용한 방법
- loc를 사용해야한다.
예시
mask = df2["target"] == 1 # 생존자만 찾기
mask
=>
0 False
1 False
2 False
3 False
4 True
...
1304 False
1305 True
1306 False
1307 False
1308 False
Name: target, Length: 1309, dtype: bool
- 다중 조건을 주어 마스킹
- 데이터프레임에서는 논리 연산자를 지원하지 않는다.
- or 대신 |(Vertical bar)
- 둘중에 하나가 1 이면 1을 반환
- and 대신 &(Ampersand)
- 둘다 1이면 1을 반환
- not 대신 ~(tilde)
- 1 면 0을 반환
mask1 = df2["target"] == 1
mask2 = df2["age"] < 20
df2.loc[mask1 & mask2].head()
=>
passengerid pclass name gender age sibsp parch ticket fare cabin embarked target
23 262 3 Asplund, Master. Edvin Rojj Felix male 3.0 4 2 347077 31.3875 NaN S 1
29 193 3 Andersen-Jensen, Miss. Carla Christine Nielsine female 19.0 1 0 350046 7.8542 NaN S 1
31 428 2 Phillips, Miss. Kate Florence ("Mrs Kate Louis... female 19.0 0 0 250655 26.0000 NaN S 1
36 209 3 Carr, Miss. Helen "Ellen" female 16.0 0 0 367231 7.7500 NaN Q 1
39 185 3 Kink-Heilmann, Miss. Luise Gretchen female 4.0 0 2 315153 22.0250 NaN S 1
데이터 형식에 기반한 열 선택
df.select_dtypes(include="float64")
=>
age fare
0 22.0 7.2500
1 38.0 71.2833
2 26.0 7.9250
3 35.0 53.1000
4 35.0 8.0500
... ... ...
1304 NaN 8.0500
1305 39.0 108.9000
1306 38.5 7.2500
1307 NaN 8.0500
1308 NaN 22.3583
1309 rows × 2 columns
- 수치형 데이터타입의 컬럼 모두 선택하기
df.select_dtypes(include="number") # number 문자형이나 숫자형 모두 선택
=>
passengerid pclass age sibsp parch fare target
0 1 3 22.0 1 0 7.2500 0
1 2 1 38.0 1 0 71.2833 1
2 3 3 26.0 0 0 7.9250 1
3 4 1 35.0 1 0 53.1000 1
4 5 3 35.0 0 0 8.0500 0
... ... ... ... ... ... ... ...
1304 1305 3 NaN 0 0 8.0500 0
1305 1306 1 39.0 0 0 108.9000 1
1306 1307 3 38.5 0 0 7.2500 0
1307 1308 3 NaN 0 0 8.0500 0
1308 1309 3 NaN 1 1 22.3583 0
1309 rows × 7 columns
그동안 배운 연산들이 Series 단위로 지원
df["ticket"] + "/" + df["cabin"]
=>
0 NaN
1 PC 17599/C85
2 NaN
3 113803/C123
4 NaN
...
1304 NaN
1305 PC 17758/C105
1306 NaN
1307 NaN
1308 NaN
Length: 1309, dtype: object
- 여러 컬럼을 추가하기
data = [
["A군",30,170],
["B군",25,180],
["C군",30,175]
]
df_info = pd.DataFrame(data,columns = ["이름","나 이","키"]) # 열정보를 맞춰줘야 함!
df_info
=>
이름 나 이 키
0 A군 30 170
1 B군 25 180
2 C군 30 175
- map 메소드 사용해보기
- 딕셔너리를 전달해서 컬럼의 값들을 변경할수 있다.
- key 는 변경전 값, value 는 변경 후 값
df["gender"].map(lambda x: 1 if x == "male" else 0) # 비율이 적은 쪽에 1을 넣음
=>
0 1
1 0
2 0
3 0
4 1
..
1304 1
1305 0
1306 1
1307 1
1308 1
Name: gender, Length: 1309, dtype: int64
여기까지 pandas의 기초에 대해 알아보았다.
기초라 다행히 이해하는데는 무리가 없었다.
728x90
'AI 공부 > 파이썬' 카테고리의 다른 글
파이썬 (Pandas를 이용한 전처리 - 1) (0) | 2022.08.30 |
---|---|
파이썬 (Pandas를 이용한 EDA) (0) | 2022.08.30 |
파이썬 (Numpy) (0) | 2022.08.24 |
파이썬 (SQLAIchemy) (0) | 2022.08.23 |
파이썬 (Pymysql) (0) | 2022.08.23 |
댓글