2017年10月3日 星期二

Python-Pandas

Python_pandas:以諾貝爾得獎資料為例

記得先下載一下諾貝爾得獎資料,github上有得下載!

IMPORT

import pandas as pd
df = pd.read_csv('你的檔案位置或是網路連結')

基礎操作

範例_columns:取得所有欄位

df.columns

範例_set_index:設置索引

#  name的部份可以調整你要的欄位
df = df.set_index('name')  
#  依你要搜尋的name來下條件,就跟sql的where一樣
df.loc('xxxx')  
#  透過reset調整回來以數值搜尋
df = df.reset_index()

範例_iloc與loc

loc是以標籤(索引)來做搜尋,而iloc是以位置
df.iloc[2]

範例_groupby:選擇群組

phy_group = df.groupby('category')
phy_group.groups.keys()
phy_group = phy_group.get_group('physics')
phy_group.category  
pyh_group.head()

範例_透過布林遮罩顯示需求資料列

groupby之外的方法
df[df.category == 'physics']

建立DataFrame的方式

dict

df = pd.DataFrame.from_dict([
       {'name':'123','tel':123},
       {'name':'456','tel':456}
       ])
       

JSON

#  讀取json檔
df = pd.DataFrame.read_json('Source')
#  寫入json檔
json = df.to_json('Target', orient='records')

CSV

#  讀取csv,也可以搭配stringio將文字轉csv
#  sep用於定義分割符號
#  names用於欄位標題
from StringIO import StringIO
df = pd.read_csv('Source', 
                 sep=',', 
                 names=['head1','head2'...],
                 skipinitialspace=True,
                 quotechar="")
#  寫入csv
df.to_csv('Target', encoding='utf8')

EXCEL

excel的部份用到python的xlrd的lib,故要記得import!

方法一

dfs = []
xls = pd.ExcelFile('Source')
#  取得工作表,
df['Shee1'] = xls.parse('SourceSheet1',  #  來源excel的sheet
                        na_values=['NA'],  #  把什麼字串視為null
                        index_cols=1,  #  設定抬頭欄位索引是那一列
                        skiprows=3)  #  跳過幾行

方法二

df = pd.DataFrame.read_excel('SourceExcel',
                             ['SourceExcelSheet1', 'SourceExcelSheet2'],
                             index_col=None,
                             na_values=['NA'])                             
來源sheet的部份可以用名稱,也可以用索引
df_dict = pd.DataFrame.read_excel('SourceExcel', sheetname=None)
以上面的方式操作,就會把所有的工作表載到df_dict裡面
其餘的參數
parse_col=4 就代表取前5欄的資料
parse_col=[1, 4] 就代表取第2與第5欄的資料

寫入excel

df.to_excel('TargetExcel',sheet_name='SheetName')

SQL

MongoDB

mongoDB的部份,是以BSON(binary json)的格式來儲存。

讀取

from pymongo import MongoClient
client = MongoClient()
db = client.YourDB  #  取得資料庫
cursor = db.Yourdc.find()  #  取得Yourdc的所有文件
df = pd.DataFrame(list(cursor))

寫入

db = get_mongo_database('YourDB')
#  將dataframe轉dict,records代表把列轉為個別物件
records = df.to_dict('records')  
db[collection].insert(records)

Series轉DataFrame

Panel

理解上,就有點像是dataset,而DataFrame就是table!
df1 = pd.DataFrame({'abc':[1, 2, 3]})
df2 = pd.DataFrame({'def':[4, 5, 6]})
pn = pd.Panel({'item1':df1, 'item2':df2})
pn

資料清理

範例:info(資料檢索)

取得df上的資料、屬性、項目數量、記憶體用量
df.info()

由資料也可以看到,975列的資料,有些資料不足,那代表資料是有空缺的!

範例:describe(數值欄位統計摘要)

df.describe()

如果想要對其它類型也做出統計
df.describe(include=['object'])

圖可以看到,數量(count),不重覆值(unique),最高(top)…等有用資訊!
像美國就是最多的國家!

範例:head(取得前五筆資料)

df.head()

範例:tail(取得末五筆資料)

df.tail()

範例:isnull(查null資料)

取得資料為null的資料列
df.isnull()
回傳資料是null的話就是True

範例:isnull().sum()(查null各欄總數)

回傳各欄null數
df.isnull().sum()

範例:drop(移除資料集)

配合isnull的話,就可以移除null資料行
df = df[df.firstname.isnull() == False]
#  記得,是null就是True,所以非null就是False
要刪除整列的話
df.drop('surname', axis=1)
當然,null的部份除了直接移除之外也可以利用其它插補法來補值。

範例:取DataFrame欄

兩種方法都可以!
會回傳series物件,並保留DataFrame的索引
city_col = df.city
or
city_col = df['city']

範例:選擇多列

df[0:10]  #  取前10列
df[-4:0]  #  取最後4列

範例:利用條件取資料

mask = df.year > 2000
#  需注意mask此時為True, False
df[mask]  #  這樣子就能取得mask為True的資料
or
y2000 = df[df.year>2000]

範例:確認欄位型別

set(df.city.apply(type))

可以看出city這個欄位不乾不淨的兩個型別!

範例:replace取代字串

#  拿上面的y2000
dd = df.city
dd.replace('', np.nan, inplace=True)
dd.count()
#  整個df一起轉換
df.replace('',np.nan, inplace=True)
上面的語法可以把空格轉numpy的NaN格式
如此在計算的時候就不會把值加進去了!

範例:replace取代目標欄位數值

在資料預處理的時候,有時候我們會需要將字串標籤調整成數值標籤。
如True、False要改成1、0,
作法上,我們會先宣告一個dict,再透過pandas的replace來處理。
dict = {'label':{'True':1,'False':0}}      # label = column name
ata.replace(dict,inplace = True)
這樣,就可以把資料集內的字串調整成數值了。

範例:利用str+正則式清理資料,去空格,移除部份符號

df[df.name.str.contains('\*')]['name']  #  顯示有*的資料
df.name = df.name.str.replace('*','')  #  取代*
df.name = df.name.str.strip()  #  去空格

沒有留言:

張貼留言