본문 바로가기
AI 공부/파이썬

파이썬 (Pandas 기초)

by AI Sonny 2022. 8. 30.
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

댓글