Liz's Blog

Python學習筆記#3:Pandas篇

| Comments

使用jupyter notebook如果不知道function功能或預設值是什麼,使用shift+tab查詢。例如:想知道apply(),可以輸入df.apply(,按shift+tab看小抄啦!

Udemy
課程名稱:Python for Data Science and Machine Learning Bootcamp
講師:Jose Portilla

Pandas套件算是補足Python資料分析及模型的部分,用起來更像R。

1.使用終端機安裝Pandas套件
conda install pandas

2.在jupyter notebook載入NumPy及Pandas套件

import numpy as np
import pandas as pd

3.Series
(1)可將list、numpy array、dictionary轉成Series

labels = ['r','p','g']
li = [5,6,7]
arr = np.array([5,6,7])
dic = {'r':5,'p':6,'g':7}

pd.Series(li)
pd.Series(li,labels)
pd.Series(arr)
pd.Series(arr,labels)
pd.Series(dic,labels)

(2)Pandas Series的資料可以是object型態,也可以是function型態

pd.Series(labels)
pd.Series([max,print,min])

(3)使用Series的重點在於了解索引。Pandas藉由快速搜尋的方式來索引名稱或數字。

ser1 = pd.Series([29,32,19],index=['TPE','KH','BER'])
ser1

ser2 = pd.Series([35,28,12],index=['TPE','KH','MEL'])
ser2

#可直接索引字串
ser1['TPE']

#Series彼此也可以運算,但若資料不齊則會出現NaN(Not a number)
ser1 + ser2

4.Data Frame
Data Frame可以說是pandas的主幹,且是受到R語言啟發。Data Frame可視為好幾個Series集合再一起,共用相同的索引。
(1)載入numpy套件中的randn,且設定隨機種子

from numpy.random import randn
np.random.seed(101)

df = pd.DataFrame(randn(4,3),index='A B C D'.split(),columns='E F G'.split())
df

(2)選取與索引

#可直接輸入欄位名稱取得資料
df['E']

df[['E','G']]

#Data Frame的columns(欄位)其實就是Series
type(df['F'])

#建立新columns(欄位)
df['H'] = df['E'] + df['G']
df

#移除columns(欄位)
df.drop('F',axis=1)

#inplace預設為False,所以沒有真正去除
df

df.drop('F',axis=1,inplace=True)
df

#也可以去除橫排 axis=0
df.drop('A',axis=0)

#利用location的label來選擇特定橫排
df.loc['B']

#iloc = integer-location
df.iloc[2]

#選擇subset
df.loc['B','G']

df.loc[['B','C'],['G','H']]

(3)條件式選取

#使用條件式則會出現T或F
df < 0 

#再使用資料名稱加[]則可以顯現結果
df[df<0]

df[df['E']<0]

df[df['E']<0]['G']

df[df['E']<0][['E','H']]

#兩個條件以上時,且使用&,或使用|
df[(df['E']>0) & (df['H']>0)]

(4)More Index Details

df

#重設index
df.reset_index()

newind = 'TPE KH BER MEL'.split()
df['City'] = newind
df

df.set_index('City')
df

#設定inplace=True才會修改成功
df.set_index('City',inplace=True)
df

(5)Multi-Index and Index Hierarchy

#索引levels
outside=['V1','V1','V1','V2','V2','V2']
inside=[1,5,3,1,3,5]
hier_index=list(zip(outside,inside))
hier_index=pd.MultiIndex.from_tuples(hier_index)
hier_index

#建立隨機數字
df = pd.DataFrame(np.random.randn(6,2),index=hier_index,columns=['A','B'])
df

#用df.loc[]來索引hierarchy
df.loc['V1']

df.loc['V1'].loc[1]

df.index.names
df.index.names = ['Version','Num']
df

#也可以用xs()索引hierarchy
df.xs('V2')

df.xs(['V1',1])
df.xs(1,level='Num')

5.遇到Missing Data時,pandas可以如何做

df = pd.DataFrame({'A':[5,4,np.nan],
                   'B':[1,np.nan,np.nan],
                   'C':[7,7,7]})
df

#去除含NaN的橫排
df.dropna()

#去除含NaN的行
df.dropna(axis=1)

#去除含兩個以上NaN的橫排
df.dropna(thresh=2)

#將NaN欄位改成其他值
df.fillna(value='Fill Value')

#將NaN值改成該欄所有平均值
df['A'].fillna(value=df['A'].mean())

6.Groupby(groupby可以將不同橫排資料聚集起來,並且呼叫aggregate function)

data = {'Company':['star','star','sun','sun','moon','moon'],
        'Person':['John','Doe','Jena','Doe2','Eason','Dave'],
        'Sales':[500,520,380,400,360,400]}
df = pd.DataFrame(data)
df

#利用groupby將Company相同的欄位聚集起來
by_comp = df.groupby('Company')

#依照公司Sales計算平均值
by_comp.mean()

#依照公司Sales計算標準差
by_comp.std()

#依照公司Sales取出最大值
by_comp.max()

#計算筆數
by_comp.count()

#顯示平均值、標準差、最小值及最大值等
by_comp.describe()

#改成直立顯示
by_comp.describe().transpose()

by_comp.describe().transpose()['star']

7.Merging, Joining, and Concatenating
(1)Concatenation(可以將好幾個Data Frame黏在一起)

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                    index=[0, 1, 2, 3])
df1

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
                    'B': ['B4', 'B5', 'B6', 'B7'],
                    'C': ['C4', 'C5', 'C6', 'C7'],
                    'D': ['D4', 'D5', 'D6', 'D7']},
                    index=[4, 5, 6, 7])
df2

df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
                    'B': ['B8', 'B9', 'B10', 'B11'],
                    'C': ['C8', 'C9', 'C10', 'C11'],
                    'D': ['D8', 'D9', 'D10', 'D11']},
                    index=[8, 9, 10, 11])
df3

pd.concat([df1,df2,df3])

#以增加欄位的方式合併不同Data Frame
pd.concat([df1,df2,df3],axis=1)

(2)Merge(merge功能有點類似將SQL tables合併在一起)

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})
left

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
right

pd.merge(left,right,how='inner',on='key')

更複雜一點的例子

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                     'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})
    
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
                      
pd.merge(left,right,on=['key1','key2'])

#使用相同的key當作合併的依據
pd.merge(left,right,how='outer',on=['key1','key2'])

#使用右邊data frame的key當作合併的依據
pd.merge(left,right,how='right',on=['key1','key2'])

#使用左邊data frame的key當作合併的依據
pd.merge(left,right,how='left',on=['key1','key2'])

(3)Joining(使用join將兩個不同index的columns結合在一起,預設方法是以左邊data frame index為主)

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                     index=['K0', 'K1', 'K2']) 

right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                      'D': ['D0', 'D2', 'D3']},
                      index=['K0', 'K2', 'K3'])
                      
left.join(right)

#使用兩個DataFrame的index的聯集
left.join(right,how='outer')

#使用兩個DataFrame的index的交集
left.join(right,how='inner')

left.join(right,how='right')

8.Operation
(1)Info on Unique Values

df = pd.DataFrame({'col1':[5,6,7,8],
                   'col2':[100,101,101,103],
                   'col3':['ceo','coo','qoo','cfo']})
df

#取data frame中欄位沒有重複的數
df['col2'].unique()

#取data frame中欄位沒有重複的數的數目
df['col2'].nunique()

#統計沒有重複的數
df['col2'].value_counts()

(2)Selecting Data

#使用條件式篩選data frame
newdf = df[(df['col1'] >5) & (df['col2']==101)]
newdf

(3)Applying Function

def double(x):
    return x*2

#apply代入function
df['col1'].apply(double)

#len()=字串長度
df['col3'].apply(len)

df['col2'].sum()

#暫時移除欄位
del df['col1']
df

#取得column名稱
df.columns

#取得index位置
df.index

#排序data frame
df.sort_values(by='col2')

#確認有無null值
df.isnull()

(4)建立一個類似樞紐分析表的表格

data = {'A':['pen','pen','pen','knife','knife','knife'],
        'B':['Marketing','Sales','Sales','Sales','Sales','Marketing'],
        'C':['x','y','x','y','x','y'],
        'D':[1,3,2,5,4,1]}

df = pd.DataFrame(data)
df

df.pivot_table(values='D',index=['A','B'],columns=['C'])

9.資料匯入匯出
(1)csv

#csv匯入
df = pd.read_csv('example')
df

#csv匯出
df.to_csv('example',index=False)

(2)excel

#excel匯入
pd.read_excel('Excel_Sample.xlsx',sheetname='Sheet1')

#excel匯出
df.to_excel('Excel_Sample.xlsx',sheet_name='Sheet1')

(3)html

#爬取html,先在終端機安裝lxml、html5lib、BeautifulSoup4套件
conda install lxml
conda install html5lib
conda install BeautifulSoup4
#html匯入
df = pd.read_html('http://www.fdic.gov/bank/individual/failed/banklist.html')
df[0]

Comments

comments powered by Disqus