• 데이터프레임을 특정 파일로 저장 : DF.to_파일형식()
  • 인덱스 없애기 : DF.to_파일형식(index=False)

  • NA 값이 있는 열 제거 : DF.dropna(axis=1)
  • NA 값이 있는 행 제거 : DF.dropna(axis=0)
  • NA 값이 있는 열과 행 제거 : DF.dropna()

  • 특정 칼럼 제거 : DF.drop(columns=[칼럼명들], inplace=Bool) : inplace = 본 데이터프레임에 덮어쓰기
  • 특정 행 제거 : DF.drop(index=[인덱스], inplace=Boo;) : inplace = 본 데이터프레임에 덮어쓰기

  • 인덱스 재설정 : DF.reset_index(drop=Bool, inplace=Bool) : drop = 기존 인덱스 삭제, inplace = 본 데이터프레임에 덮어쓰기

Pandas

  • python data analysis 의 약자
  • DataFrame이라는 테이블(표) 형식의 자료 형식을 사용한다.
  • DataFrame은 여러 열이 하나의 테이블을 이루는 데이터 구조.
  • 하나의 열은 시리즈(Series)라고 부름
  • Series와 DataFrame의 각 열에는 Index가 매겨진다.
  • value가 행렬 형식이기 때문에 numpy로 연산이 가능
  • 정형 데이터 처리에 특화된 라이브러리

판다스를 쉽게 설명하자면, “파이썬에서 사용하는 엑셀” 이라고 할 수 있습니다.

대표적 메서드

데이터프레임 만들기

메서드명 설명 파라미터
df = pandas.DataFrame(data, index, columns, dtype, copy) df라는 변수에 DataFrame 형식 Object 생성 data : 데이터프레임화 할 값
index : 행(시리즈)의 제목을 지정
columns : 열의 제목을 지정
dtype : value의 데이터타입을 지정
copy : value를 복사본으로 사용할지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pandas as pd
import random

ls_list = []

for i in range(5):  # 데이터프레임화 할 값 리스트 만들기
  ls = []
  for j in range(3):
    ls.append(random.randint(0, 10))
  ls.list.append(ls)

print(ls_list)  # 데이터프레임화 할 값
# >>> [[9, 4, 5], [5, 7, 3], [9, 6, 0], [2, 10, 1], [4, 9, 1]]

df = pd.DataFrame(data = ls_list, # 데이터프레임화
                  index = ["첫번째","두번째","세번째","네번째","다섯번째"],
                  columns = ["1열","2열","3열"],
                  dtype = float)

print(df)
# >>>        1열    2열   3열
# >>> 첫번째   9.0   4.0  5.0
# >>> 두번째   5.0   7.0  3.0
# >>> 세번째   9.0   6.0  0.0
# >>> 네번째   2.0  10.0  1.0
# >>> 다섯번째  4.0   9.0  1.0

위에 이어서 copy 파라미터의 예시는 아래와 같습니다.
정리하자면 copy = False (기본 세팅) 이면 원본값 변경에 따름,
copy = True 면 복사본을 사용하므로 원본값에 영향을 받지 않음.
으로 말할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import pandas as pd
import numpy as np

arr = np.random.randint(10, size=(2, 2))  # 2 X 2 랜덤 행렬

df_nocopy = pd.DataFrame(arr, copy=False) # copy = False
df_copy = pd.DataFrame(arr, copy=True)    # copy = True
df_default = pd.DataFrame(arr)            # default 기본

arr[0,0] = 1000     # 행렬의 첫값을 1000으로 변경

print(df_nocopy)  # 원본값이 변경되면 DataFrame 값도 변경
# >>>       0  1
# >>> 0  1000  6
# >>> 1     0  0

print(df_copy)    # 원본값이 변경되어도 불변
# >>>    0  1
# >>> 0  0  6
# >>> 1  0  0

print(df_default)  # 기본 세팅은 copy = False
# >>>       0  1
# >>> 0  1000  6
# >>> 1     0  0

하지만 list 를 원본으로 하는 경우, copy 파라미터는 의미가 없습니다.
이는 list 의 mutable 성질로 인해, copy = False 를 사용하더라도 DataFrame은 원본 데이터를 보호하기 위해 내부적으로 복사(copy)를 수행하기 때문입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd

ls_list = [[9, 10, 5], [5, 7, 3], [9, 6, 0]]

df_copy = pd.DataFrame(ls_list, copy=True)
df_nocopy = pd.DataFrame(ls_list, copy=False)

ls_list[0][0] = 1000

print(df_copy)
# >>>    0   1  2
# >>> 0  9  10  5
# >>> 1  5   7  3
# >>> 2  9   6  0

print(df_nocopy)
# >>>    0   1  2
# >>> 0  9  10  5
# >>> 1  5   7  3
# >>> 2  9   6  0

파일 읽기

판다스는 테이블 형식의 외부 파일을 불러들여와 DataFrame 형태로 만들 수 있습니다.

메서드명 설명 예시
pandas.read_csv(path) csv 형식의 자료를 데이터프레임으로 읽어들임 df = pandas.read_csv(path)
pandas.read_excel(path) excel 형식의 자료(.xls, .xlsx)를 데이터프레임으로 읽어들임 df = pandas.read_excel(path)
pandas.read_json(path) json 형식의 자료(.json)를 데이터프레임으로 읽어들임 df = pandas.read_json(path)
pandas.read_sql(path) sql 형식의 자료를 읽어들임 df = pandas.read_sql(path)

외부에 아래와 같은 엑셀파일을 판다스로 불러와보겠습니다.

.{width=300px;}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
import openpyxl

path = "./car.xlsx"
df = pd.read_excel(path)

print(df)

# >>>    번호   자동차명  연비  가격  판매량
# >>> 0   1   1번자동차  15  1500  900
# >>> 1   2   2번자동차  14  2100  800
# >>> 2   3   3번자동차   2  3500  100
# >>> 3   4   4번자동차   8  2000  200
# >>> 4   5   5번자동차   8  1200  100
# >>> 5   6   6번자동차   5  1000  300
# >>> 6   7   7번자동차  10  1100  400

openpyxl 은 xlsx 형식을 다루기 위한 의존성 라이브러리입니다. 보여주기위해 import 했을 뿐, 판다스 내부에서 import 하기 때문에 실제 사용시에는 import를 하지 않아도 됩니다.

데이터프레임 정보 (조회)

df 는 데이터프레임 Object를 뜻합니다.

메서드명 설명
df.head(n) 데이터프레임의 처음부터 n번째 행까지 반환
df.tail(n) 데이터프레임의 마지막 n개 행의 내용 반환
df.sample(n) 데이터프레임에서 n개의 랜덤 자료를 반환
df.info() 데이터에 대한 전체적인 요약정보
df.describe() 데이터에 대한 전체적인 통계정보
df.index 데이터프레임의 인덱스를 반환
df.columns 데이터프레임의 열 제목을 반환
df.keys() 상동
df.values 데이터의 value 를 반환
df.dtypes 데이터타입을 반환
df.size value의 개수를 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 살펴보기
import pandas as pd

path = "./car.xlsx"
df = pd.read_excel(path)

print(df.head(2))
# >>>   번호   자동차명  연비  가격  판매량
# >>> 0   1  1번자동차  15  1500  900
# >>> 1   2  2번자동차  14  2100  800

print(df.tail(2))
# >>>    번호   자동차명  연비  가격  판매량
# >>> 5   6  6번자동차    5  1000  300
# >>> 6   7  7번자동차   10  1100  400

print(df.sample(2))
# >>>    번호   자동차명  연비  가격  판매량
# >>> 5   6  6번자동차    5  1000   300
# >>> 2   3  3번자동차    2  3500   100

다음은 info와 describe 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# info, describe
import pandas as pd

path = "./car.xlsx"
df = pd.read_excel(path)

print(df.info())
# >>> <class 'pandas.core.frame.DataFrame'>
# >>> RangeIndex: 7 entries, 0 to 6
# >>> Data columns (total 5 columns):
# >>>  #   Column  Non-Null Count  Dtype 
# >>> ---  ------  --------------  ----- 
# >>>  0   번호      7 non-null      int64 
# >>>  1   자동차명    7 non-null      object
# >>>  2   연비      7 non-null      int64 
# >>>  3   가격      7 non-null      int64 
# >>>  4   판매량     7 non-null      int64 
# >>> dtypes: int64(4), object(1)
# >>> memory usage: 408.0+ bytes
# >>> None

print(df.describe())
# >>>          번호         연비           가격         판매량
# >>> count  7.000000   7.000000     7.000000    7.000000
# >>> mean   4.000000   8.857143  1771.428571  400.000000
# >>> std    2.160247   4.634241   875.051019  326.598632
# >>> min    1.000000   2.000000  1000.000000  100.000000
# >>> 25%    2.500000   6.500000  1150.000000  150.000000
# >>> 50%    4.000000   8.000000  1500.000000  300.000000
# >>> 75%    5.500000  12.000000  2050.000000  600.000000
# >>> max    7.000000  15.000000  3500.000000  900.000000

index, column 등 구조적인 정보를 볼 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 구조적인 정보
import pandas as pd

path = "./car.xlsx"
df = pd.read_excel(path)

print(df.index)
# >>> RangeIndex(start=0, stop=7, step=1)

print(df.columns)
# >>> Index(['번호', '자동차명', '연비', '가격', '판매량'], dtype='object')

print(df.values)
# >>> [[1 '1번자동차' 15 1500 900]
# >>>  [2 '2번자동차' 14 2100 800]
# >>>  [3 '3번자동차' 2 3500 100]
# >>>  [4 '4번자동차' 8 2000 200]
# >>>  [5 '5번자동차' 8 1200 100]
# >>>  [6 '6번자동차' 5 1000 300]
# >>>  [7 '7번자동차' 10 1100 400]]

print(df.dtypes)
# >>> 번호       int64
# >>> 자동차명    object
# >>> 연비       int64
# >>> 가격       int64
# >>> 판매량      int64
# >>> dtype: object

print(df.size)
# >>> 35

저장

데이터프레임은 테이블 형식의 외부 자료형으로 저장할 수 있습니다.

df 는 데이터프레임 Object를 뜻합니다.

메서드명 설명
df.to_csv(path) csv 형식으로 저장
df.to_excel(path) 엑셀 형식으로 저장
df.to_json(path) json 형식으로 저장
1
2
3
4
5
6
7
8
9
10
import pandas as pd

path = "./car.xlsx"
df = pd.read_excel(path)

export_path = "./car_export"

df.to_csv(export_path + ".csv")
df.to_excel(export_path + ".xlsx")
df.to_json(export_path + ".json")

json 형태는 아래와 같이 저장됩니다.

행 또는 열 선택하기

데이터프레임의 특정 행 또는 열을 선택하는 방식은 아래와 같습니다.

df 는 데이터프레임 Object를 뜻합니다.

메서드 설명 비고
df[“컬럼명”] 데이터프레임의 특정 컬럼 내용을 반환 컬럼 선택
df[[“컬럼명1”, “컬럼명2”]] 다수의 컬럼 내용을 반환 컬럼 선택
df.loc[n] 데이터프레임의 n 번째 행 내용을 반환 행 선택
df.loc[start:end] loc는 슬라이싱도 가능 행 선택
df.iloc[n] 데이터프레임의 n 번째 열 내용을 반환 행 선택
df.iloc[start:end] iloc 또한 슬라이싱 가능 행 선택
df[df[n] == 값 데이터프레임 중 특정 조건을 만족하는 내용 반환 조건

먼저, 이번에는 loc와 iloc의 차이를 보기 위해 인덱스값을 별도로 준 데이터프레임을 생성하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np

ls_columns = ["1번열", "2번열", "3번열", "4번열"]
ls_indices = ["1번", "2번", "3번", "4번", "5번"]
value_arry = np.random.randint(10, size=(5, 4))

df = pd.DataFrame(value_arry, columns = ls_columns,
                  index = ls_indices, copy = True)

print(df)
# >>>     1번열 2번열 3번열 4번열
# >>> 1번    7    0    0    1
# >>> 2번    1    7    4    7
# >>> 3번    0    9    6    0
# >>> 4번    3    0    7    1
# >>> 5번    5    4    1    5

여기에서 특정 컬럼을 선택할 때에는 [“컬럼명”] 과 같이 명시해주면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print(df["1번열"])            # 하나의 컬럼
# >>> 1번    7
# >>> 2번    1
# >>> 3번    0
# >>> 4번    3
# >>> 5번    5
# >>> Name: 1번열, dtype: int64

print(df[["1번열", "4번열"]])  # 다수의 컬럼
# >>>     1번열 4번열
# >>> 1번    7    1
# >>> 2번    1    7
# >>> 3번    0    0
# >>> 4번    3    1
# >>> 5번    5    5

loc와 iloc는 모두 “행”을 선택할 때 사용합니다.
차이점으로는 loc는 행의 이름을, iloc는 행의 번호를 이용한다는 점이 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# /==== loc ====/
print(df.loc["3번"])
# >>> 1번열    0
# >>> 2번열    9
# >>> 3번열    6
# >>> 4번열    0
# >>> Name: 3번, dtype: int64

print(df.loc[["3번", "4번"]])
# >>>     1번열 2번열 3번열 4번열
# >>> 3번    0    9    6    0
# >>> 4번    3    0    7    1


# /==== iloc ====/
print(df.iloc[2])
# >>> 1번열    0
# >>> 2번열    9
# >>> 3번열    6
# >>> 4번열    0
# >>> Name: 3번, dtype: int64

print(df.iloc[2:4])
# >>>     1번열 2번열 3번열 4번열
# >>> 3번    0    9    6    0
# >>> 4번    3    0    7    1

특정 조건을 만족하는 행 또는 열, 혹은 값을 반환받거나 조건을 만족하는지 여부를 알 수도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
print(df[df["2번열"] > 5])
# >>>     1번열 2번열 3번열 4번열
# >>> 2번    1    7    4    7
# >>> 3번    0    9    6    0

print(df.loc["1번"] == 0)
# >>> 1번열    False
# >>> 2번열     True
# >>> 3번열     True
# >>> 4번열    False
# >>> Name: 1번, dtype: bool

통계값

평균, 합, 중앙값, 사분위수 등의 통계값을 얻을 수도 있습니다.
위에서 살펴본 describe를 통해 전체적인 통계값을 얻을 수 있었다면, 좀 더 세부적인 통계를 얻는 것은 아래의 메서드들을 사용합니다.

df 는 데이터프레임 Object를 뜻합니다.

메서드 설명
df.sum() 합을 반환
df.max() 최대값을 반환
df.min() 최소값을 반환
df.mean() 평균값을 반환
df.mode() 최빈값을 반환
df.std() 표준편차를 반환
df.var() 분산을 반환
df.median() 중앙값을 반환
df.quantile() 분위수를 반환
그 외 다수  

아래와 같이 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pandas as pd
import numpy as np

ls_columns = ["1번열", "2번열", "3번열", "4번열"]
ls_indices = ["1번", "2번", "3번", "4번", "5번"]
value_arry = [[7, 0, 0, 1], [1, 7, 4, 7], [0, 9, 6, 0], [3, 0, 7, 1], [5, 4, 1, 5]]

df = pd.DataFrame(value_arry, columns = ls_columns, index = ls_indices, copy = True)

print(df)
# >>>     1번열 2번열 3번열 4번열
# >>> 1번    7    0    0    1
# >>> 2번    1    7    4    7
# >>> 3번    0    9    6    0
# >>> 4번    3    0    7    1
# >>> 5번    5    4    1    5

print(df.sum())
# >>> 1번열    16
# >>> 2번열    20
# >>> 3번열    18
# >>> 4번열    14 
# >>> dtype: int64

print(df["1번열"].sum())
# >>> 16

print(df[df["2번열"] == 0].sum()) # 조건을 줄 수도 있음
# >>> 1번열    10
# >>> 2번열     0
# >>> 3번열     7
# >>> 4번열     2
# >>> dtype: int64

그 외 동일하므로 빠르게 패스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print(df.max())   # 최대값
# >>> 1번열    7
# >>> 2번열    9
# >>> 3번열    7
# >>> 4번열    7
# >>> dtype: int64

print(df.min())   # 최소값
# >>> 1번열    0
# >>> 2번열    0
# >>> 3번열    0
# >>> 4번열    0
# >>> dtype: int64

print(df.mean())  # 평균값
# >>> 1번열    3.2
# >>> 2번열    4.0
# >>> 3번열    3.6
# >>> 4번열    2.8
# >>> dtype: float64

print(df["2번열"].mode())  # 최빈값 (가장 많이 등장하는 값)
# >>> 0

한 박자 쉬고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
print(df.std())       # 표준편차
# >>> 1번열    2.863564
# >>> 2번열    4.062019
# >>> 3번열    3.049590
# >>> 4번열    3.033150
# >>> dtype: float64

print(df.var())       # 분산
# >>> 1번열     8.2
# >>> 2번열    16.5
# >>> 3번열     9.3
# >>> 4번열     9.2
# >>> dtype: float64

print(df.median())    # 중앙값
# >>> 1번열    3.0
# >>> 2번열    4.0
# >>> 3번열    4.0
# >>> 4번열    1.0
# >>> dtype: float64

print(df.quantile())  # 분위수 / 미지정시 등분
# >>> 1번열    3.0
# >>> 2번열    4.0
# >>> 3번열    4.0
# >>> 4번열    1.0
# >>> Name: 0.5, dtype: float64

print(df.quantile(0.25))
# >>> 1번열    1.0
# >>> 2번열    0.0
# >>> 3번열    1.0
# >>> 4번열    1.0
# >>> Name: 0.25, dtype: float64

그룹화, 통계

그룹바이.. 피벗..

메서드 설명 파라미터
df.groupby() 데이터프레임 그룹화 연산 by : 그룹화할 기준. index, column 등
axis , leve 등은 생략

실습을 위한 데이터프레임을 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 데이터프레임 만들기
import pandas as pd

df = pd.read_excel("./car.xlsx")
print(df)

# >>>    번호  자동차명 연비   가격  판매량  종류 제조사
# >>> 0   1  1번자동차  15  1500   900  소형   A사
# >>> 1   2  2번자동차  14  2100   800  소형   D사
# >>> 2   3  3번자동차   2  3500   100  대형   A사
# >>> 3   4  4번자동차   8  2000   200  중형   A사
# >>> 4   5  5번자동차   8  1200   100  중형   B사
# >>> 5   6  6번자동차   5  1000   300  대형   C사
# >>> 6   7  7번자동차  10  1100   400  중형   B사

기본적인 groupby를 해보겠습니다.
특정 칼럼의 value 중 같은 값끼리 묶어 데이터프레임을 다시 보여줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
print(df.groupby("제조사").count()) # 제조사로 묶음
# >>>      번호 자동차명 연비 가격 판매량 종류
# >>> 제조사                           
# >>> A사    3     3   3   3    3   3
# >>> B사    2     2   2   2    2   2
# >>> C사    1     1   1   1    1   1
# >>> D사    1     1   1   1    1   1

print(df.groupby(["제조사","종류"]).count()) # 제조사와 종류로 묶음
# >>>         번호 자동차명 연비 가격 판매량
# >>> 제조사 종류                       
# >>> A사  대형   1     1   1   1    1
# >>>     소형   1     1   1   1    1
# >>>     중형   1     1   1   1    1
# >>> B사  중형   2     2   2   2    2
# >>> C사  대형   1     1   1   1    1
# >>> D사  소형   1     1   1   1    1

print(df.groupby(["제조사","종류","자동차명"]).mean()) # 평균값
# >>>                번호    연비      가격    판매량
# >>> 제조사 종류 자동차명                           
# >>> A사  대형 3번자동차  3.0   2.0  3500.0  100.0
# >>>     소형 1번자동차  1.0  15.0  1500.0  900.0
# >>>     중형 4번자동차  4.0   8.0  2000.0  200.0
# >>> B사  중형 5번자동차  5.0   8.0  1200.0  100.0
# >>>        7번자동차  7.0  10.0  1100.0  400.0
# >>> C사  대형 6번자동차  6.0   5.0  1000.0  300.0
# >>> D사  소형 2번자동차  2.0  14.0  2100.0  800.0

사칙연산

안에 있다 없다 같다(이퀄즈) 비교(컴페어) 엔유니크 덧셈 뺄셈 곱셉 나눅셈 나머지 거듭제곱 행렬곲

구조적 변환, 가공

인서트 팝 드롭 카피 드롭듀플리케이트 리플레이스 트랜스폼 트랜스포즈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# drop : 행 또는 열을 삭제  

import pandas as pd

df = pd.read_excel("./car.xlsx")
print(df)

# >>>    번호  자동차명 연비   가격  판매량  종류 제조사
# >>> 0   1  1번자동차  15  1500   900  소형   A사
# >>> 1   2  2번자동차  14  2100   800  소형   D사
# >>> 2   3  3번자동차   2  3500   100  대형   A사
# >>> 3   4  4번자동차   8  2000   200  중형   A사
# >>> 4   5  5번자동차   8  1200   100  중형   B사
# >>> 5   6  6번자동차   5  1000   300  대형   C사
# >>> 6   7  7번자동차  10  1100   400  중형   B사

print(df.drop(index=[0, 1, 2, 5]))
#### 0, 1, 2, 5 번째 index 를 삭제
# >>>    번호  자동차명 연비   가격  판매량  종류 제조사
# >>> 3   4  4번자동차   8  2000   200  중형   A사
# >>> 4   5  5번자동차   8  1200   100  중형   B사
# >>> 6   7  7번자동차  10  1100   400  중형   B사

print(df.drop(columns=["제조사","판매량","자동차명"]))
# >>>    번호 연비  가격  종류
# >>> 0   1  15  1500  소형
# >>> 1   2  14  2100  소형
# >>> 2   3   2  3500  대형
# >>> 3   4   8  2000  중형
# >>> 4   5   8  1200  중형
# >>> 5   6   5  1000  대형
# >>> 6   7  10  1100  중형

NA 값 관련

드롭엔에이 이즈인

??

아이템즈

값 이용하기

조인 키스 밸류스 라인드 리플레이스 솔트

인덱스

셋인덱스

Reference

SeSAC 수업
pandas DOC : https://pandas.pydata.org/docs/
https://wikidocs.net/151329