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() # 去空格
沒有留言:
張貼留言