pandas IV

pandas IV


Pivot Table

  • Index 축은 groupby와 동일함
  • Column에 추가로 labeling 값을 추가하여,
    Value에 numeric type값을 aggregation 하는 형태
In [1]:
import pandas as pd
import numpy as np
In [2]:
df_phone = pd.read_csv("./data/phone_data.csv")
df_phone.head()
Out[2]:
index date duration item month network network_type
0 0 15/10/14 06:58 34.429 data 2014-11 data data
1 1 15/10/14 06:58 13.000 call 2014-11 Vodafone mobile
2 2 15/10/14 14:46 23.000 call 2014-11 Meteor mobile
3 3 15/10/14 14:48 4.000 call 2014-11 Tesco mobile
4 4 15/10/14 17:27 4.000 call 2014-11 Tesco mobile
In [3]:
df_phone.pivot_table(values=["duration"],index=['month', 'item'],
                     columns='network',aggfunc="sum",fill_value=0)
Out[3]:
duration
network Meteor Tesco Three Vodafone data landline special voicemail world
month item
2014-11 call 1521 4045 12458 4316 0.000 2906 0 301 0
data 0 0 0 0 998.441 0 0 0 0
sms 10 3 25 55 0.000 0 1 0 0
2014-12 call 2010 1819 6316 1302 0.000 1424 0 690 0
data 0 0 0 0 1032.870 0 0 0 0
sms 12 1 13 18 0.000 0 0 0 4
2015-01 call 2207 2904 6445 3626 0.000 1603 0 285 0
data 0 0 0 0 1067.299 0 0 0 0
sms 10 3 33 40 0.000 0 0 0 0
2015-02 call 1188 4087 6279 1864 0.000 730 0 268 0
data 0 0 0 0 1067.299 0 0 0 0
sms 1 2 11 23 0.000 0 2 0 0
2015-03 call 274 973 4966 3513 0.000 11770 0 231 0
data 0 0 0 0 998.441 0 0 0 0
sms 0 4 5 13 0.000 0 0 0 3
  • values: 값을 나타낼 컬럼
  • index: 인덱스로 사용할 컬럼들 groupby되는 컬럼이라고 생각하면 편하다
  • columns: index로 groupby되고 나온 DataFrame에서의 column을 선택하는 값. 이 값이 헷갈릴 수 있는데 index로 grouped된 DataFrame에 대해서 해당 columns의 인자로 다시 groupby을 한다고 생각하면 편하다.
  • aggfunc: 해당 값의 집계함수



Crosstab

  • 특히 두 칼럼에 교차 빈도,비율,덧셈 등을 구할 때 사용
  • Pivot table의 특수한 형태
  • User-Item Rating Matrix등을 만들 때 사용가능함
In [4]:
df_phone.pivot_table(values=["duration"],
    index='network',
    columns='network_type',
    aggfunc="first",
    fill_value=0)
Out[4]:
duration
network_type data landline mobile special voicemail world
network
Meteor 0.000 0 23 0 0 0
Tesco 0.000 0 4 0 0 0
Three 0.000 0 602 0 0 0
Vodafone 0.000 0 13 0 0 0
data 34.429 0 0 0 0 0
landline 0.000 6 0 0 0 0
special 0.000 0 0 1 0 0
voicemail 0.000 0 0 0 19 0
world 0.000 0 0 0 0 1



Merge & Concat


Merge

  • SQL에서 많이 사용하는 Merge와 같은 기능
  • 두 개의 데이터를 하나로 합침

image.png

두 DataFrame의 column이 다르다면 다음과 같이 설정을 해줘야 한다. image.png

join method

image.png

In [5]:
raw_data = {
    "subject_id": ["1", "2", "3", "4", "5"],
    "first_name": ["Alex", "Amy", "Allen", "Alice", "Ayoung"],
    "last_name": ["Anderson", "Ackerman", "Ali", "Aoni", "Atiches"],
}
df_a = pd.DataFrame(raw_data, columns=["subject_id", "first_name", "last_name"])
df_a
Out[5]:
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Alice Aoni
4 5 Ayoung Atiches
In [6]:
raw_data = {
    "subject_id": ["4", "5", "6", "7", "8"],
    "first_name": ["Billy", "Brian", "Bran", "Bryce", "Betty"],
    "last_name": ["Bonder", "Black", "Balwner", "Brice", "Btisan"],
}
df_b = pd.DataFrame(raw_data, columns=["subject_id", "first_name", "last_name"])
df_b
Out[6]:
subject_id first_name last_name
0 4 Billy Bonder
1 5 Brian Black
2 6 Bran Balwner
3 7 Bryce Brice
4 8 Betty Btisan


left join

In [7]:
pd.merge(df_a, df_b, on="subject_id", how="left")
Out[7]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 1 Alex Anderson NaN NaN
1 2 Amy Ackerman NaN NaN
2 3 Allen Ali NaN NaN
3 4 Alice Aoni Billy Bonder
4 5 Ayoung Atiches Brian Black


right join

In [8]:
pd.merge(df_a, df_b, on="subject_id", how="right")
Out[8]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 4 Alice Aoni Billy Bonder
1 5 Ayoung Atiches Brian Black
2 6 NaN NaN Bran Balwner
3 7 NaN NaN Bryce Brice
4 8 NaN NaN Betty Btisan


full(outer) join

In [9]:
pd.merge(df_a, df_b, on="subject_id", how="outer")
Out[9]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 1 Alex Anderson NaN NaN
1 2 Amy Ackerman NaN NaN
2 3 Allen Ali NaN NaN
3 4 Alice Aoni Billy Bonder
4 5 Ayoung Atiches Brian Black
5 6 NaN NaN Bran Balwner
6 7 NaN NaN Bryce Brice
7 8 NaN NaN Betty Btisan


inner join

  • pd.mergehow의 default는 inner이다.
In [10]:
pd.merge(df_a, df_b, on="subject_id", how="inner")
Out[10]:
subject_id first_name_x last_name_x first_name_y last_name_y
0 4 Alice Aoni Billy Bonder
1 5 Ayoung Atiches Brian Black


index based join

  • index를 기준으로 merge를 하고 싶으면 right_index, left_index인자를 사용
In [11]:
pd.merge(df_a, df_b, right_index=True, left_index=True)
Out[11]:
subject_id_x first_name_x last_name_x subject_id_y first_name_y last_name_y
0 1 Alex Anderson 4 Billy Bonder
1 2 Amy Ackerman 5 Brian Black
2 3 Allen Ali 6 Bran Balwner
3 4 Alice Aoni 7 Bryce Brice
4 5 Ayoung Atiches 8 Betty Btisan



concat

  • 같은 형태의 데이터를 붙이는 연산작업

image.png

In [12]:
df_b.append([1,2,3])
Out[12]:
0 first_name last_name subject_id
0 NaN Billy Bonder 4
1 NaN Brian Black 5
2 NaN Bran Balwner 6
3 NaN Bryce Brice 7
4 NaN Betty Btisan 8
0 1.0 NaN NaN NaN
1 2.0 NaN NaN NaN
2 3.0 NaN NaN NaN
In [13]:
display(df_a)
display(df_b)
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Alice Aoni
4 5 Ayoung Atiches
subject_id first_name last_name
0 4 Billy Bonder
1 5 Brian Black
2 6 Bran Balwner
3 7 Bryce Brice
4 8 Betty Btisan


세로로 붙이기

In [14]:
df_new = pd.concat([df_a, df_b])
df_new
Out[14]:
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Alice Aoni
4 5 Ayoung Atiches
0 4 Billy Bonder
1 5 Brian Black
2 6 Bran Balwner
3 7 Bryce Brice
4 8 Betty Btisan
In [15]:
df_a.append(df_b)
Out[15]:
subject_id first_name last_name
0 1 Alex Anderson
1 2 Amy Ackerman
2 3 Allen Ali
3 4 Alice Aoni
4 5 Ayoung Atiches
0 4 Billy Bonder
1 5 Brian Black
2 6 Bran Balwner
3 7 Bryce Brice
4 8 Betty Btisan
  • 이때 주의할 점은 열의 개수가 맞아야 한다.


가로로 붙이기

In [16]:
df_new = pd.concat([df_a, df_b], axis=1)
df_new
Out[16]:
subject_id first_name last_name subject_id first_name last_name
0 1 Alex Anderson 4 Billy Bonder
1 2 Amy Ackerman 5 Brian Black
2 3 Allen Ali 6 Bran Balwner
3 4 Alice Aoni 7 Bryce Brice
4 5 Ayoung Atiches 8 Betty Btisan
  • 이때 주의 할 점은 행의 개수가 맞아야 한다.



persistence


Database connection

  • Data loading시 db connection 기능을 제공함

image.png


XLS persistence

In [17]:
df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})
writer = pd.ExcelWriter('./data/pandas_simple.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')

# Close the Pandas Excel writer and output the Excel file.
writer.save()


Pickle persistence

  • 가장 일반적인 python 파일 persistence
  • to_pickle, read_pickle함수 사용
In [18]:
# DataFrame 저장
df.to_pickle("./data/df.pickle")
In [19]:
del df
In [20]:
df_pickle=pd.read_pickle("./data/df.pickle")
df_pickle
Out[20]:
Data
0 10
1 20
2 30
3 20
4 15
5 30
6 45

'AI > 이론' 카테고리의 다른 글

seaborn  (0) 2021.01.29
matplotlib II  (0) 2021.01.29
matplotlib I  (0) 2021.01.29
확률론 맛보기  (0) 2021.01.28
Pandas III  (0) 2021.01.28
딥러닝 학습방법 이해하기  (0) 2021.01.27
Pandas II  (0) 2021.01.27
Pandas I  (0) 2021.01.27

+ Recent posts