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
| 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
| 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
(Index(['A', 'B', 'C', 'D', 'E'], dtype='object'), array([0, 7, 1, 8, 2]))
(7, 7)
A 0
B 7
C 10
D 8
E 2
dtype: int32
A 0
B 70
C 100
D 80
E 20
dtype: int32
B 7
C 10
dtype: int32
C 10
E 2
dtype: int32
E 2
D 8
C 10
B 7
A 0
dtype: int32
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
|
A NaN
B NaN
C NaN
D 11.0
E 7.0
F NaN
dtype: float64
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 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 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 |
Index(['one', 'two'], dtype='object')
Index(['name', 'email'], dtype='object')
array([['dss', 'dss@gmail.com'],
['fcamp', 'fcamp@daum.net']], dtype=object)
1 2 3
| df = pd.DataFrame(datas) df
|
|
name |
email |
| 0 |
dss |
dss@gmail.com |
| 1 |
fcamp |
fcamp@daum.net |
'fcamp@daum.net'
1 2 3
| 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 |
0 dss
1 fcamp
2 andy
Name: name, dtype: object
|
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) df
|
|
name |
email |
id |
| 0 |
dss |
dss@gmail.com |
1 |
| 1 |
fcamp |
fcamp@daum.net |
2 |
| 2 |
andy |
andy@naver.com |
3 |
name object
email object
id int32
dtype: object
1
| df.loc[[0,2], ["email", "id"]]
|
|
email |
id |
| 0 |
dss@gmail.com |
1 |
| 2 |
andy@naver.com |
3 |
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 |
|
name |
email |
id |
| 0 |
dss |
dss@gmail.com |
1 |
| 1 |
fcamp |
fcamp@daum.net |
2 |
|
name |
email |
id |
| 1 |
fcamp |
fcamp@daum.net |
2 |
| 2 |
andy |
andy@naver.com |
3 |
3. apply 함수
|
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)
|
|
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 |
'Alvin'
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
| 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
| 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
| 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 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
| 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 |
|
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)
- 두개 이상의 데이터 프레임을 합쳐서 결과를 출력하는 방법