티스토리 뷰
파이썬 라이브러리 pandas
1. Pandas 란?
Pandas는 파이썬에서 사용하는 데이터분석 라이브러리로, 행과 열로 이루어진 데이터 객체를 다루어 안정적으로 대용량의 데이터들을 처리하는 도구 입니다.
1) pandas 설치 및 사용
먼저 pandas를 사용하기 위해서는 pandas를 설치한 이후에 아래와 같이 import를 해야 합니다.
pip install pandas --user
import pandas as pd
import numpy as np #일반적으로 pandas 사용시 array 객체인 numpy 도 함께 import 한다
2) pandas 라이브러리가 지원하는 데이터 테이블
Series: 1차원의 데이터를 다루기 위한 도구입니다. DataFrame에서 하나의 열을 추출하면 Series 객체가 반환됩니다.
DataFrame: 2차원의 테이블 형태의 데이터를 다루기 위한 도구입니다. 행과 열에 이름을 붙일 수 있으며, 다양한 데이터 타입을 지원합니다. Panel: 3차원의 데이터를 다루기 위한 도구입니다. Panel은 현재는 사용되지 않으며, xarray 라이브러리 사용이 권장됩니다.
2. Series 기본
BASIC_01.Pandas¶
In [1]:
import pandas as pd
import numpy as np
# pandas 에는 Series, DataFrame, ...
Seriese 사용해보기¶
In [2]:
sr = pd.Series([1,2,3,4,5])
sr
Out[2]:
0 1 1 2 2 3 3 4 4 5 dtype: int64
In [3]:
# Series의 값
sr.values
Out[3]:
array([1, 2, 3, 4, 5], dtype=int64)
In [4]:
# Series의 index
sr.index
Out[4]:
RangeIndex(start=0, stop=5, step=1)
In [5]:
# Series의 DataType
sr.dtypes
Out[5]:
dtype('int64')
In [6]:
sr2 = pd.Series([1,2,3,4,5],index=['A','B','C','D','E'])
sr2
Out[6]:
A 1 B 2 C 3 D 4 E 5 dtype: int64
In [7]:
sr.index=['A','B','C','D','E'] #와 같은 효과
sr
Out[7]:
A 1 B 2 C 3 D 4 E 5 dtype: int64
In [8]:
sr["A"]=100 # "A" index에 value 100 값을 넣기
sr
Out[8]:
A 100 B 2 C 3 D 4 E 5 dtype: int64
Series의 생성 및 중요 Method¶
In [10]:
ser = pd.Series([1,2,3,4,5,6,7,8,9,10])
In [15]:
ser_sum = ser.sum() #합계
ser_min = ser.min() #최소값
ser_max = ser.max() #최대값
ser_sum, ser_min, ser_max
Out[15]:
(55, 1, 10)
In [19]:
ser_mean = ser.mean() #평균
ser_std = ser.std() #표준편차
ser_skew = ser.skew() #왜도
ser_kurt = ser.kurt() #첨도
ser_mean, ser_std, ser_skew, ser_kurt
Out[19]:
(5.5, 3.0276503540974917, 0.0, -1.2000000000000002)
In [28]:
ser_unique = ser.unique() #고유값
ser_idxmax = ser.idxmax() #최대값의 위치
ser_idxmin = ser.idxmin() #최소값의 위치
ser_isin = ser.isin([1,2,3,4]) #포함 여부 확인
ser_unique, ser_idxmax, ser_idxmin, ser_isin
Out[28]:
(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=int64), 9, 0, 0 True 1 True 2 True 3 True 4 False 5 False 6 False 7 False 8 False 9 False dtype: bool)
In [29]:
ser.isin([6,7]).sum() # True =1 , False =0 으로 연산이 가능하여 sum() 을 활용 가능
Out[29]:
2
3. DataFrame 기본
BASIC_01.Pandas¶
In [1]:
import pandas as pd
import numpy as np
# pandas 에는 Series, DataFrame, ...
DataFrame 사용해보기¶
In [2]:
data = {"names": ["kim", "lee", "park", "choi", "moon", "ahn"],
"year": [2023, 2022, 2021, 2020, 2019, 2018],
"score": [87, 73, 70, 92, 56, 50] }
df = pd.DataFrame(data, columns=["year", "names", "score", "note"],
index=[1,2,3,4,5,6])
df = pd.DataFrame(data, columns=["year", "names", "score", "note"],
index=range(1,7)) #index=[1,2,3,4,5,6] 과 같음
df
Out[2]:
year | names | score | note | |
---|---|---|---|---|
1 | 2023 | kim | 87 | NaN |
2 | 2022 | lee | 73 | NaN |
3 | 2021 | park | 70 | NaN |
4 | 2020 | choi | 92 | NaN |
5 | 2019 | moon | 56 | NaN |
6 | 2018 | ahn | 50 | NaN |
In [3]:
df.head(2) # Table값이 너무 큰 경우 앞쪽 2개 목록만 확인
df.tail(2) # Table값이 너무 큰 경우 뒤쪽 2개 목록만 확인
Out[3]:
year | names | score | note | |
---|---|---|---|---|
5 | 2019 | moon | 56 | NaN |
6 | 2018 | ahn | 50 | NaN |
In [4]:
df.values
Out[4]:
array([[2023, 'kim', 87, nan], [2022, 'lee', 73, nan], [2021, 'park', 70, nan], [2020, 'choi', 92, nan], [2019, 'moon', 56, nan], [2018, 'ahn', 50, nan]], dtype=object)
In [5]:
df.index
Out[5]:
RangeIndex(start=1, stop=7, step=1)
In [6]:
df.columns
Out[6]:
Index(['year', 'names', 'score', 'note'], dtype='object')
In [7]:
df.dtypes
Out[7]:
year int64 names object score int64 note object dtype: object
In [8]:
df
Out[8]:
year | names | score | note | |
---|---|---|---|---|
1 | 2023 | kim | 87 | NaN |
2 | 2022 | lee | 73 | NaN |
3 | 2021 | park | 70 | NaN |
4 | 2020 | choi | 92 | NaN |
5 | 2019 | moon | 56 | NaN |
6 | 2018 | ahn | 50 | NaN |
In [9]:
df.index.name = "NUM"
df.columns.name = "User"
df
Out[9]:
User | year | names | score | note |
---|---|---|---|---|
NUM | ||||
1 | 2023 | kim | 87 | NaN |
2 | 2022 | lee | 73 | NaN |
3 | 2021 | park | 70 | NaN |
4 | 2020 | choi | 92 | NaN |
5 | 2019 | moon | 56 | NaN |
6 | 2018 | ahn | 50 | NaN |
In [10]:
df["year"] # df.year 으로 사용해도 동일
Out[10]:
NUM 1 2023 2 2022 3 2021 4 2020 5 2019 6 2018 Name: year, dtype: int64
In [11]:
df2 = df[["names", "score"]].copy()
df2
Out[11]:
User | names | score |
---|---|---|
NUM | ||
1 | kim | 87 |
2 | lee | 73 |
3 | park | 70 |
4 | choi | 92 |
5 | moon | 56 |
6 | ahn | 50 |
In [12]:
#df["note"] = "O" #으로 입력하면 전체 값 "O" 으로 입력
df["note"] = ["O", "X", "O", "O", "X", "X"]
df
Out[12]:
User | year | names | score | note |
---|---|---|---|---|
NUM | ||||
1 | 2023 | kim | 87 | O |
2 | 2022 | lee | 73 | X |
3 | 2021 | park | 70 | O |
4 | 2020 | choi | 92 | O |
5 | 2019 | moon | 56 | X |
6 | 2018 | ahn | 50 | X |
In [13]:
df["point"] = np.arange(6)
#df["address"] = range(6) 와 같음
df
Out[13]:
User | year | names | score | note | point |
---|---|---|---|---|---|
NUM | |||||
1 | 2023 | kim | 87 | O | 0 |
2 | 2022 | lee | 73 | X | 1 |
3 | 2021 | park | 70 | O | 2 |
4 | 2020 | choi | 92 | O | 3 |
5 | 2019 | moon | 56 | X | 4 |
6 | 2018 | ahn | 50 | X | 5 |
In [14]:
# Series로 특정 행값을 해당하는 index에 추가
val = pd.Series([-1.2, -1.5, -1.7], index=[1, 2, 6])
val
Out[14]:
1 -1.2 2 -1.5 6 -1.7 dtype: float64
In [15]:
df.point = val # Series 값에 없는 값들은 NaN 값으로 변경됨
df
Out[15]:
User | year | names | score | note | point |
---|---|---|---|---|---|
NUM | |||||
1 | 2023 | kim | 87 | O | -1.2 |
2 | 2022 | lee | 73 | X | -1.5 |
3 | 2021 | park | 70 | O | NaN |
4 | 2020 | choi | 92 | O | NaN |
5 | 2019 | moon | 56 | X | NaN |
6 | 2018 | ahn | 50 | X | -1.7 |
In [16]:
val2 = np.arange(5,11) # np.arange 입력시 행(row)크기에 맞춰서 넣어줘야만 반영 됨
val2
Out[16]:
array([ 5, 6, 7, 8, 9, 10])
In [17]:
df.point = val2
df
Out[17]:
User | year | names | score | note | point |
---|---|---|---|---|---|
NUM | |||||
1 | 2023 | kim | 87 | O | 5 |
2 | 2022 | lee | 73 | X | 6 |
3 | 2021 | park | 70 | O | 7 |
4 | 2020 | choi | 92 | O | 8 |
5 | 2019 | moon | 56 | X | 9 |
6 | 2018 | ahn | 50 | X | 10 |
In [18]:
df["high_score"] = df["score"] > 80
df
Out[18]:
User | year | names | score | note | point | high_score |
---|---|---|---|---|---|---|
NUM | ||||||
1 | 2023 | kim | 87 | O | 5 | True |
2 | 2022 | lee | 73 | X | 6 | False |
3 | 2021 | park | 70 | O | 7 | False |
4 | 2020 | choi | 92 | O | 8 | True |
5 | 2019 | moon | 56 | X | 9 | False |
6 | 2018 | ahn | 50 | X | 10 | False |
In [19]:
df['test'] = True
df
Out[19]:
User | year | names | score | note | point | high_score | test |
---|---|---|---|---|---|---|---|
NUM | |||||||
1 | 2023 | kim | 87 | O | 5 | True | True |
2 | 2022 | lee | 73 | X | 6 | False | True |
3 | 2021 | park | 70 | O | 7 | False | True |
4 | 2020 | choi | 92 | O | 8 | True | True |
5 | 2019 | moon | 56 | X | 9 | False | True |
6 | 2018 | ahn | 50 | X | 10 | False | True |
In [20]:
#df = df.replace({"O":1,"X":0})
#df = df.replace({True:1,False:0})
#high_score에 해당하는 값만 replace
df['high_score'] = df['high_score'].replace({True:1,False:0})
df
Out[20]:
User | year | names | score | note | point | high_score | test |
---|---|---|---|---|---|---|---|
NUM | |||||||
1 | 2023 | kim | 87 | O | 5 | 1 | True |
2 | 2022 | lee | 73 | X | 6 | 0 | True |
3 | 2021 | park | 70 | O | 7 | 0 | True |
4 | 2020 | choi | 92 | O | 8 | 1 | True |
5 | 2019 | moon | 56 | X | 9 | 0 | True |
6 | 2018 | ahn | 50 | X | 10 | 0 | True |
In [21]:
del df['test']
del df['point']
df
Out[21]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
NUM | |||||
1 | 2023 | kim | 87 | O | 1 |
2 | 2022 | lee | 73 | X | 0 |
3 | 2021 | park | 70 | O | 0 |
4 | 2020 | choi | 92 | O | 1 |
5 | 2019 | moon | 56 | X | 0 |
6 | 2018 | ahn | 50 | X | 0 |
In [22]:
df[:3] # df[0:3] 와 같음
Out[22]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
NUM | |||||
1 | 2023 | kim | 87 | O | 1 |
2 | 2022 | lee | 73 | X | 0 |
3 | 2021 | park | 70 | O | 0 |
In [23]:
#df.index = np.arange(0,6)
df.index = pd.Series(["a","b","c","d","e","f"])
df
Out[23]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
a | 2023 | kim | 87 | O | 1 |
b | 2022 | lee | 73 | X | 0 |
c | 2021 | park | 70 | O | 0 |
d | 2020 | choi | 92 | O | 1 |
e | 2019 | moon | 56 | X | 0 |
f | 2018 | ahn | 50 | X | 0 |
DataFrame loc, iloc 사용¶
In [24]:
# loc은 location 'b'에 해당하는 행
df.loc['b']
Out[24]:
User year 2022 names lee score 73 note X high_score 0 Name: b, dtype: object
In [25]:
df.loc['b':'e'] # df['b':'e'] 와 같으나 확장성을 위해 loc 를 사용하도록 한다
Out[25]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
b | 2022 | lee | 73 | X | 0 |
c | 2021 | park | 70 | O | 0 |
d | 2020 | choi | 92 | O | 1 |
e | 2019 | moon | 56 | X | 0 |
In [26]:
df.loc['b':'e', 'score']
Out[26]:
b 73 c 70 d 92 e 56 Name: score, dtype: int64
In [27]:
df.loc[:,'names'] # == df['names']
Out[27]:
a kim b lee c park d choi e moon f ahn Name: names, dtype: object
In [28]:
# iloc은 index 번호를 사용한 location
df.iloc[3] # 3번째 행
Out[28]:
User year 2020 names choi score 92 note O high_score 1 Name: d, dtype: object
In [29]:
df.iloc[0:3, 0:2]
Out[29]:
User | year | names |
---|---|---|
a | 2023 | kim |
b | 2022 | lee |
c | 2021 | park |
In [30]:
df.iloc[:,1:2] #첫번째 열만 출력
Out[30]:
User | names |
---|---|
a | kim |
b | lee |
c | park |
d | choi |
e | moon |
f | ahn |
DataFrame 의 bool type 다루기¶
In [31]:
df.index = np.arange(1,7)
df['score'] > 70
Out[31]:
1 True 2 True 3 False 4 True 5 False 6 False Name: score, dtype: bool
In [32]:
#score가 70점보다 큰 모든 행의 값
df.loc[df['score'] > 70, :]
#df.loc[df['score'] > 70, ['names','score','note']]
Out[32]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
1 | 2023 | kim | 87 | O | 1 |
2 | 2022 | lee | 73 | X | 0 |
4 | 2020 | choi | 92 | O | 1 |
In [33]:
#df.loc[ 조건문 , columns 선택 ]
df.loc[df['names'] == 'choi', ['names', 'score']]
Out[33]:
User | names | score |
---|---|---|
4 | choi | 92 |
In [34]:
#df.loc[ 조건문 , columns 선택 ]
#df.loc[ (df["score"]>50) & (df["note"]=="X"), ["names","score"]]
df.loc[(df['score'] > 70) & (df['note']=="X"),:]
Out[34]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
2 | 2022 | lee | 73 | X | 0 |
In [35]:
df.loc[df['score'] > 70, 'note'] = 'O'
df
Out[35]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
1 | 2023 | kim | 87 | O | 1 |
2 | 2022 | lee | 73 | O | 0 |
3 | 2021 | park | 70 | O | 0 |
4 | 2020 | choi | 92 | O | 1 |
5 | 2019 | moon | 56 | X | 0 |
6 | 2018 | ahn | 50 | X | 0 |
In [36]:
# 새로운 행 삽입
df.loc['7',:] = [2017,'ryu',37, "O", False]
df['high_score'] = df['high_score'].replace({True:1,False:0})
df
Out[36]:
User | year | names | score | note | high_score |
---|---|---|---|---|---|
1 | 2023.0 | kim | 87.0 | O | 1 |
2 | 2022.0 | lee | 73.0 | O | 0 |
3 | 2021.0 | park | 70.0 | O | 0 |
4 | 2020.0 | choi | 92.0 | O | 1 |
5 | 2019.0 | moon | 56.0 | X | 0 |
6 | 2018.0 | ahn | 50.0 | X | 0 |
7 | 2017.0 | ryu | 37.0 | O | 0 |
'Computer > Python' 카테고리의 다른 글
Python Pandas / loc, iloc, Nan, unique, drop (0) | 2023.08.31 |
---|---|
Python Jupyter 설치 (0) | 2023.08.28 |
댓글