Pandas

  • 데이터 분석을 위한 사용이 쉽고 성능이 좋은 오픈소스 python 라이브러리
  • R과 Pandas의 특징
    • R보다 Pandas가 학습이 쉽습니다.
    • R보다 Pandas가 성능이 좋습니다.
    • R보다 Python은 활용할 수 있는 분야가 많습니다.
  • 크게 두가지 데이터 타입을 사용합니다.
    • Serise : index와 value로 이루어진 데이터 타입
    • DataFrame : index, column, value로 이루어진 데이터 타입
1
2
import numpy as np
import pandas as pd

1. Series

  • 동일한 데이터 타입의 값을 갖습니다.
1
2
3
# Series : value 만 설정하면 index는 0부처 자동으로 설정됩니다.
data = pd.Series(np.random.randint(10, size=5))
data
0    3
1    4
2    5
3    0
4    3
dtype: int32
1
2
3
# index 설정
data = pd.Series(np.random.randint(10, size=5), index=list('ABCDE'))
data
A    0
B    7
C    1
D    8
E    2
dtype: int32
1
data.index, data.values
(Index(['A', 'B', 'C', 'D', 'E'], dtype='object'), array([0, 7, 1, 8, 2]))
1
data["B"], data.B
(7, 7)
1
2
data["C"] = 10
data
A     0
B     7
C    10
D     8
E     2
dtype: int32
1
2
# 브로드 캐스팅
data * 10
A      0
B     70
C    100
D     80
E     20
dtype: int32
1
data[["B","C"]]
B     7
C    10
dtype: int32
1
2
# offset index
data[2::2]
C    10
E     2
dtype: int32
1
data[::-1]
E     2
D     8
C    10
B     7
A     0
dtype: int32
1
# Series 연산
1
data
A     0
B     7
C    10
D     8
E     2
dtype: int32
1
2
data2 = pd.Series({"D":3, "E":5, "F":7})
data2
D    3
E    5
F    7
dtype: int64
1
2
result = data + data2
result # None
A     NaN
B     NaN
C     NaN
D    11.0
E     7.0
F     NaN
dtype: float64
1
result.isnull()
A     True
B     True
C     True
D    False
E    False
F     True
dtype: bool
1
2
result[result.isnull()] = data
result
A     0.0
B     7.0
C    10.0
D    11.0
E     7.0
F     NaN
dtype: float64
1
2
result[result.isnull()] = data2
result
A     0.0
B     7.0
C    10.0
D    11.0
E     7.0
F     7.0
dtype: float64

2. DataFrame

  • 데이터 프레임은 여러개의 Series로 구성
  • 같은 컬럼에 있는 value값은 같은 데이터 타입을 갖습니다.
1
# 데이터 프레임 생성 1 : 딕셔너리의 리스트
1
2
3
4
5
datas = {
"name":["dss", "fcamp"],
"Email":["dss@gmail.com","fcamp@daum.net"]
}
datas
{'name': ['dss', 'fcamp'], 'Email': ['dss@gmail.com', 'fcamp@daum.net']}
1
2
df = pd.DataFrame(datas)
df

name Email
0 dss dss@gmail.com
1 fcamp fcamp@daum.net
1
# 데이터 프레임 생성 2 : 리스트의 딕셔너리
1
2
3
4
5
datas = [
{"name":"dss", "email":"dss@gmail.com"},
{"name":"fcamp", "email":"fcamp@daum.net"},
]
datas
[{'name': 'dss', 'email': 'dss@gmail.com'},
 {'name': 'fcamp', 'email': 'fcamp@daum.net'}]
1
2
df = pd.DataFrame(datas)
df

name email
0 dss dss@gmail.com
1 fcamp fcamp@daum.net
1
2
3
# 인덱스를 추가하는 방법
df = pd.DataFrame(datas, index = ["one", "two"])
df

name email
one dss dss@gmail.com
two fcamp fcamp@daum.net
1
df.index
Index(['one', 'two'], dtype='object')
1
df.columns
Index(['name', 'email'], dtype='object')
1
df.values
array([['dss', 'dss@gmail.com'],
       ['fcamp', 'fcamp@daum.net']], dtype=object)
1
# 데이터 프레임에서 데이터의 선택 : row, column, (row, column)
1
2
3
# row 선택 : loc
df = pd.DataFrame(datas)
df

name email
0 dss dss@gmail.com
1 fcamp fcamp@daum.net
1
df.loc[1]["email"]
'fcamp@daum.net'
1
2
3
# index가 있으면 수정, 없으면 추가
df.loc[2] = {"name":"andy", "email":"andy@naver.com"}
df

name email
0 dss dss@gmail.com
1 fcamp fcamp@daum.net
2 andy andy@naver.com
1
# column 선택
1
df["name"]
0      dss
1    fcamp
2     andy
Name: name, dtype: object
1
2
df["id"] = ""
df

name email id
0 dss dss@gmail.com
1 fcamp fcamp@daum.net
2 andy andy@naver.com
1
2
df["id"] = range(1, 4) # np.arange(1, 4)
df

name email id
0 dss dss@gmail.com 1
1 fcamp fcamp@daum.net 2
2 andy andy@naver.com 3
1
df.dtypes
name     object
email    object
id        int32
dtype: object
1
# row, column 선택
1
df.loc[[0,2], ["email", "id"]]

email id
0 dss@gmail.com 1
2 andy@naver.com 3
1
# 컬럼 데이터 순서 설정
1
df[["id", "name", "email"]]

id name email
0 1 dss dss@gmail.com
1 2 fcamp fcamp@daum.net
2 3 andy andy@naver.com
1
# head, tail
1
df.head(2)

name email id
0 dss dss@gmail.com 1
1 fcamp fcamp@daum.net 2
1
df.tail(2)

name email id
1 fcamp fcamp@daum.net 2
2 andy andy@naver.com 3

3. apply 함수

  • map 함수와 비슷
1
2
# email 컬럽에서 메일의 도메인만 가져와서 새로운 domain컬럼을 생성
df

name email id
0 dss dss@gmail.com 1
1 fcamp fcamp@daum.net 2
2 andy andy@naver.com 3
1
2
3
4
def domain(email):
return email.split("@")[1].split(".")[0]

domain(df.loc[0]["email"])
'gmail'
1
df["domain"] = df["email"].apply(domain)
1
df

name email id domain
0 dss dss@gmail.com 1 gmail
1 fcamp fcamp@daum.net 2 daum
2 andy andy@naver.com 3 naver
1
2
df["domain"] = df["email"].apply(lambda email:email.split("@")[1].split(".")[0])
df

name email id domain
0 dss dss@gmail.com 1 gmail
1 fcamp fcamp@daum.net 2 daum
2 andy andy@naver.com 3 naver
1
from makedata import *
1
get_name()
'Alvin'
1
get_age()
30
1
2
3
df1= pd.DataFrame(make_data(5))
df2= pd.DataFrame(make_data(5))
df2

Age Name
0 40 Billy
1 32 Anchal
2 35 Alvin
3 22 Andrew
4 27 Andrew

4. append

1
2
3
# append 데이터 프레임 합치기
df3 = df1.append(df2)
df3[2:7]

Age Name
2 34 Alvin
3 29 Billy
4 25 Anchal
0 40 Billy
1 32 Anchal
1
2
3
# reset_index 인덱스 재정렬
df3.reset_index(drop=True, inplace=True)
df3

Age Name
0 21 Alan
1 27 Alan
2 34 Alvin
3 29 Billy
4 25 Anchal
5 40 Billy
6 32 Anchal
7 35 Alvin
8 22 Andrew
9 27 Andrew
1
2
df3 = df1.append(df2, ignore_index=True)
df3

Age Name
0 21 Alan
1 27 Alan
2 34 Alvin
3 29 Billy
4 25 Anchal
5 40 Billy
6 32 Anchal
7 35 Alvin
8 22 Andrew
9 27 Andrew

5. concat

  • row나 column으로 데이터 프레임을 합칠때 사용
1
2
df3 = pd.concat([df1, df2]).reset_index(drop=True)
df3

Age Name
0 21 Alan
1 27 Alan
2 34 Alvin
3 29 Billy
4 25 Anchal
5 40 Billy
6 32 Anchal
7 35 Alvin
8 22 Andrew
9 27 Andrew
1
pd.concat([df3, df1], axis=1, join="inner")

Age Name Age Name
0 21 Alan 21 Alan
1 27 Alan 27 Alan
2 34 Alvin 34 Alvin
3 29 Billy 29 Billy
4 25 Anchal 25 Anchal

group by

  • 특정 컬럽의 중복되는 데이터를 합쳐서 새로운 데이터 프레임을 만드는 방법
1
2
df = pd.DataFrame(make_data())
df

Age Name
0 35 Alvin
1 26 Arnold
2 26 Jin
3 23 Anchal
4 30 Adam
5 21 Arnold
6 33 Adam
7 21 Adam
8 24 Alvin
9 32 Andrew
1
2
3
# size
result_df = df.groupby("Name").size().reset_index(name="count")
result_df

Name count
0 Adam 3
1 Alvin 2
2 Anchal 1
3 Andrew 1
4 Arnold 2
5 Jin 1
1
# sort_values : 설정한 컬럼으로 데이터 프레임을 정렬
1
2
3
result_df.sort_values(["count"], ascending = False, inplace = True)
result_df.reset_index(drop=True, inplace=True)
result_df

Name count
0 Adam 3
1 Alvin 2
2 Arnold 2
3 Anchal 1
4 Andrew 1
5 Jin 1
1
2
# agg
# size(), min(), max(), mean()
1
df.groupby("Name").agg("min").reset_index()

Name Age
0 Adam 21
1 Alvin 24
2 Anchal 23
3 Andrew 32
4 Arnold 21
5 Jin 26
1
2
# 데이터를 요약해서 보여주는 함수
df.describe()

Age
count 10.000000
mean 27.100000
std 5.087021
min 21.000000
25% 23.250000
50% 26.000000
75% 31.500000
max 35.000000

7. Merge = sql(join)

  • 두개 이상의 데이터 프레임을 합쳐서 결과를 출력하는 방법
1

Author

KangWon Seo

Posted on

2021-03-05

Updated on

2021-03-05

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.