結構化數據,我該拿你怎么辦?
首先介紹一下什么是結構化數據:
結構化數據,簡單來說就是數據庫。結合到典型場景中更容易理解,比如企業ERP、財務系統;醫療HIS數據庫;教育一卡通;政府行政審批;其他核心數據庫等。基本包括高速存儲應用需求、數據備份需求、數據共享需求以及數據容災需求。
結構化數據也稱作行數據,是由二維表結構來邏輯表達和實現的數據,嚴格地遵循數據格式與長度規范,主要通過關系型數據庫進行存儲和管理。與結構化數據相對的是不適于由數據庫二維表來表現的非結構化數據,包括所有格式的辦公文檔、XML、HTML、各類報表、圖片和咅頻、視頻信息等。支持非結構化數據的數據庫采用多值字段、了字段和變長字段機制進行數據項的創建和管理,廣泛應用于全文檢索和各種多媒體信息處理領域。
在Python中使用什么去處理結構化數據:
Pandas是python的一個數據分析包,最初由AQR Capital Management于2008年4月開發,并于2009年底開源出來,目前由專注于Python數據包開發的PyData開發team繼續開發和維護,屬于PyData項目的一部分。Pandas最初被作為金融數據分析工具而開發出來,因此,pandas為時間序列分析提供了很好的支持。 Pandas的名稱來自于面板數據(panel data)和python數據分析(data analysis)。panel data是經濟學中關于多維數據集的一個術語,在Pandas中也提供了panel的數據類型。
pandas中有個叫DataFrame的東西,它便是專門用來處理結構化數據的。
那首先我們就先來創建一個dataframe:
在創建dataframe之前我們得需要引入兩個模塊,一個就是我們剛剛所說的pandas,還有一個就是numpy:
下面我們可以來定義一個dataframe對象了:
新建dataframe對象最常用的一個方法就是直接傳遞一個字典對象給DataFrame()構造函數,具體例子如下:
輸出:
以上是創建了一個學生的信息,當然,如果你只想show某個指定的列可以直接指定(使用column直接指定即可,新建的dataframe每個column的順序和你指定的順序是一致的,和他們在字典中的順序無關):
輸出:
以上便是定義一個dataframe,除此之外還有個更簡單的方法直接定義一個dataframe,這次我們不在需要借用字典了,我們直接定義一個構造函數,然后給予它三個參數,這三個參數分別是:數據矩陣,index的選項(就是上圖輸出中自動生成的01234),column的選項。例子如下:
輸出:
如何從DataFrame中選取元素?
就拿剛剛的例子而言,如果我們想知道DataFrame所以列的名稱,我們直接調用columns屬性即可。
輸出:
同理,想要看到所有的索引列表我們也直接可以調用index屬性:
students.index
如果我們想要獲取存儲在數據結構中的所有元素,我們可以使用values屬性來獲取所有元素(數據類型是:
students.values
輸出:
對于想獲取某個單獨的列,我們可以直接將列名拿過來,類似于字典中的以鍵取值:(兩種方法都可以,效果一樣)
輸出:
如果我們想讀取某一行的記錄我們可以使用ix屬性來獲取,例如我們現在來獲取第二行(name索引為2的行)的記錄:
輸出:
那這邊有一點要講一下,ix屬性也有個獲取多行記錄的方法,和列表的切片方法差不多,例如我想獲取第二行,第三行,第四行的信息(索引值為123):
students.ix[1:3]? ? #[1:3]就代表從1到3,類似于list的切片
輸出:
那如果只需要第二行和第四行(索引為1,3)怎么辦??
很簡單,我們只需要在ix屬性里放一個列表即可:
students.ix[[1,3]] #逗號表示隔開
輸出:
那如果我們只想取某個確定的值呢?
例如我們想把Tom這個名字給取出來,我們該怎么辦?
students.ix[1]['name']
或者
students['name'][1]
以上兩種方法都可以輸出Tom。
那按照以上方法我們可以把值給取出來,也可以修改值(直接students['name'][1]=‘Alice’就可以完成更新)。
那我們現在想要添加一列新的元素,班長,他們的班長都是Tom同學,那此時我們該怎么辦?
沒錯,模仿list,我們可以直接插入一個新的column:
輸出:
那如果想刪除某個列呢?
同樣的模仿list的方法:
del students['monitor']
輸出:
最后還要一個小的知識點,如果我們想把這個Dataframe的index和column進行互換,那我們以該怎么辦?
學過線性代數的同學肯定立刻就知道了,我們可以直接使用它的轉秩:
student.T
輸出:
如果想把DataFrame轉化成其他數據類型,我們可以使用:
排序
DataFrame提供了多種排序方式。
sort_index可以以軸的標簽進行排序。axis是指用于排序的軸,可選的值有0和1,默認為0即行標簽(Y軸),1為按照列標簽排序。 ascending是排序方式,默認為True即降序排列。
students.sort(columns='two')
students.sort(columns=['ID','age'],ascending=[0,1])
DataFrame也提供按照指定列進行排序,可以僅指定一個列作為排序標準(以單獨列名作為columns的參數),也可以進行多重排序(columns的參數為一個列名的List,列名的出現順序決定排序中的優先級),在多重排序中ascending參數也為一個List,分別與columns中的List元素對應。
讀寫數據
DataFrame可以方便的讀寫數據文件,最常見的文件為CSV或Excel。Pandas讀寫Excel文件需要openpyxl(Excel 2007),
xlrd/xlwt(Excel?2003)。
從CSV中讀取數據:
df = pd.read_csv('foo.csv')
R中的對應函數:
df = read.csv('foo.csv')
將DataFrame寫入CSV:
df.to_csv('foo.csv')
R中的對應函數:
df.to.csv('foo.csv')
從Excel中讀取數據:
xls = ExcelFile('foo.xlsx')
xls.parse('sheet1', index_col=None, na_values=['NA'])
先定義一個Excel文件,用xls.parse解析sheet1的內容,index_col用于指定index列,na_values定義缺失值的標識。
將DataFrame寫入Excel文件:
默認的sheet為sheet1,也可以指定其他sheet名。
基本運算
Pandas支持基本的運算及向量化運算。
構建透視表
使用pivot_table和crosstab都可以創建數據透視表
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
'B' : ['A', 'B', 'C'] * 4,
'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D' : np.random.randn(12), 'E' : np.random.randn(12)})
pd.pivot_table(df, values = 'D', rows = ['A', 'B'], cols = ['C'])#以A、B為行標簽,以C為列標簽將D列的值匯總求和
pd.crosstab(rows = ['A', 'B'], cols = ['C'], values = 'D')#以A、B為行標簽,以C為列標簽將D列的值匯總求和
時間序列分析
時間序列也是Pandas的一個特色。時間序列在Pandas中就是以Timestamp為索引的Series。
pandas提供to_datetime方法將代表時間的字符轉化為Timestamp對象:
s = '2018-08-08 21:00:00'
ts = pd.to_datetime(s)
有時我們需要處理時區問題:
ts=pd.to_datetime(s,utc=True).tz_convert('Asia/Shanghai')
構建一個時間序列:
rng = pd.date_range('1/1/2018', periods=5, freq='M')
ts = pd.Series(randn(len(rng)), index=rng)
Pandas提供resample方法對時間序列的時間粒度進行調整:
ts_h=ts.resample('H', how='count')#M,5Min,1s
以上是將時間序列調整為小時,還可以支持月(M),分鐘(Min)甚至秒(s)等。
今天就分享到這里吧!
聽說有氣質的人都會關注這個公眾號!
Python 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。