——如果有想關注Java開發相關的內容,可以轉Java修煉之道
詳細觀看——
在學習了Numpy後,進行數據科學計算,爲何還要使用Pandas呢?其實原因就是效率高,那爲何Pandas效率比numpy要高呢?其實Pandas和Numpy還是有着很大的關係的,Pandas本身是依賴numpy的,而ndarray在內存裏佔據這一段連續的內存空間,任何改變ndarray長度的操作都勢必讓所有value改變內存中的位置因此在某種程度上,Numpy操作效率還是比較慢的。但是Pandas並不是處理所有的數據都是效率很高的,那麼一般情況下處理以下的數據比較友好:
Pandas適合處理多種類型的數據:
- 具有不同數據類型列的表格數據(DataFrame),如SQL表或Excel電子表格。
- 有序或無序(不固定頻率)的時間序列數據。
- 帶有行和列標籤的任意矩陣數據。
- 任何其他形式的觀測/統計數據集。
- Pandas主要包含三種數據結構,分別是Series(一維),DataFrame(二維),Panel(三維)。其中Series和DataFrame可以用於處理絕大多數金融,統計,社會科學和許多工程領域的典型問題。
Pandas庫是統計科學家在分析數據時的理想工具,非常適合應用於數據清洗,分析/建模,然後將分析結果組織成適合於繪圖或表格顯示的形式的全部過程。那麼其中的優勢在哪呢?
優勢
- 可以輕易地處理浮點以及非浮點類型的數據的缺失值
- 大小可變:DataFrame和Panel都可以刪除和插入
- 靈活強大的分組功能,可對數據集進行拆分組合
- 切片操作,便於索引,存取數據
數據結構
-
Series:類似於一維數組的對象,由一組數據以及一組相關的數據標籤組成的數據結構。可以將Series看成是一個定長的有序字典,因爲它是索引值到數據值的一個映射。
-
- 創建Series方法——pd.Series
-
- 獲取數組表示形式——obj.values
-
-
獲取索引對象——obj.index
eg: # 第一種創建series的方式: s1 = pd.Series([1,2,3,4,5,6,7,8,9]) print(s1) print(s1.values) # series的值 print(s1.index) # 索引信息 # 第二種創建series方式: s2 = pd.Series(np.arange(10)) print(s2) # 第三種通過字典的方式創建series: s3 = pd.Series({"cecilia":90,'cc':89,'abc':97}) print(s3) print(s3.index) s4 = pd.Series(s1.to_dict()) # 轉字典 print(s4) s5 = pd.isnull(s3) s5.index.name = "name score" # 給列名添加名稱 print(s5)
-
-
-
通過索引存取元素
>>>obj2 = pd.Series([4, 7,-5,3], index=['d','b','a','c']) #還能自定義index進行創建Series >>>obj2 d 4 b 7 a -5 c 3 dtype: int64 >>> obj2.index Index([u'd', u'b', u'a', u'c'], dtype='object') ## 通過索引存取元素和修改元素值 >>>obj2['d']= 6 # 修改index='d'的索引值 d 6 b 7 a -5 c 3 dtype: int64 >>>obj2[['c','a','d']] ## 選取index='c' 'a' 'd'的元素值 c 3 a -5 d 6 dtype: int64 ## 按照索引條件獲取元素 >>>obj2[obj2>0] d 6 b 7 c 3 dtype: int64
-
-
- 檢測缺失數據——pd.innull和pd.notnull
-
DataFrame:是一個table型數據,包含一組有序的列,每列可以是不同的值類型,DataFrame既有行索引也有列索引,可以看作是由Series組成的字典。dataFrame中的數據是以一個或者多個二維塊存放的,而不是列表、字典等。
-
-
創建DataFrame
eg: >>> data = {'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]} >>> df = pd.DataFrame(data) >>> print(df) a b c 0 1 4 7 1 2 5 8 2 3 6 9 注意:結果DataFrame會自動加上索引(跟Series一樣),且全部列會被有序悱列!!! ## 如果指定了列序列,則DataFrame的列就會按照指定順序迸行排列,如果指定的列不存在,那麼結果是一個空的dataframe >>>pd.DataFrame(data, columns=['b', 'a', 'c']) b a c 0 4 1 7 1 5 2 8 2 6 3 9
-
存取元素(其實是一個Series)
注意:
- 返冋的Series擁有原DataFrame相同的索引,且其name屬性也已經被相應地設置 好了。行也可以通過位置或名稱的方式進行獲取。
- 如果採用非整數切片的方式進行選取數據,那麼末端的索引對應的數據是包含在內的,而整數切片索引,其末端的索引對應的數據是“含前不含後”。
## 通過字典標記或者屬性來獲取Series >>> data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'], 'year':[2000, 2001, 2002, 2001, 2002], 'pop':[1.5, 1.7, 3.6, 2.4, 2.9]} >>> df= pd.DataFrame(data, columns=['year', 'state', 'pop']) >>> print(df['state']) 0 Ohio 1 Ohio 2 Ohio 3 Nevada 4 Nevada Name: state, dtype: object
-
ix、loc、iloc
-
-
ix——可以通過行號索引,也可以通過行標籤索引(從pandas 0.20.0版本開始,官方不推薦使用.ix方法,而是使用.iloc 和.loc方法)
-
loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通過行標籤索引行數據,也可以索引某行某列
-
iloc——通過行號獲取行數據或者多行數據,但是通過行標籤獲取會報錯
## 承接上面的df >> print(df.loc[1]) # 選取第一行的數據 state Ohio year 2001 pop 1.7 Name: 1, dtype: object >> print(df.loc[0:2]) # 選取index=0到index=2行的數據,總共三行數據 state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 ## 可以鎖定行,按照特徵屬性多列選取元素 >> num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars'] >> bar_heights = norm_data.loc[0, num_cols].values >> print(bar_heights) [4.3 3.55 3.9 4.5 5.0] ## 重置索引index,通過行號獲取數據 >> df.reset_index(inplace=True) >> df.head() >> print(df.iloc[2:4]) # 獲取第2行、第3行數據 index state year pop 2 2 Ohio 2002 3.6 3 3 Nevada 2001 2.4
-
-
重建索引——reindex()函數:將會根據新索引進行重排。如果某個索引值當前不存在,就引入缺失值,可以採用填充的方式處理缺失值
-
有幾種參數:
參數 說明 index 用作索引的新序列。既可以是index實例,也 可以是其他序列型的Python數據結構。Index 會被完全使用,就像沒有任何複製一樣。 method 插值(填充)方式。 fill_value 在重新索引的過程中,需要引入缺失值時使用 的替代值 . limit 前向或後向填充時的最大填充量. level 在Multiindex的指定級別上匹配簡單索引,否 則選取其子集 copy 默認爲True,無論如何都複製;如果爲False, 則新舊相等就不復制 其中method方法的參數如下: 參數 說明 ffill或pad 前向填充(或搬運)值 bfill或backfill 後向填充(或搬運)值
-
fill_value=0,直接填充0
-
-
-
- 刪除任意軸上的索引值——drop(index,axis=1/0)
-
-
apply函數——將函數應用到由各列或行所形成的一維數組上,比如sum和mean等
eg: # 將求最大值和最小值之間的差得函數運用在某一軸上 >>>f = lambda x: x.max() - x.min() >>>frame.apply(f) >>>frame.apply(f, axis=1)
-
排名和排序
-
- sort_index——對行或列索引進行排序 (按字典順序)
- order——針對按照值Series排序
- rank——排名,默認情況下,rank是通過“爲各組分配一個平均排名”的方式破壞平級關係的
eg: >>>frame = DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d','a','b','c']) >>>frame.sort_index() >>>frame.sort_index(axis=1) ## 默認的是升序排列,但也可以降序排列 >>>frame.sort_index(axis=1, ascending=False) ## 根據一個或多個列覺得值進行排序,採用**by選項** >>>frame.sort_index(by=['three', 'one']) ## 如要按照值對Series 進行排序,那麼可以order >>>obj = Series([4, 7, -3, 2]) >>>obj.order() 2 -3 3 2 0 4 1 7 >>>obj = Series([4, np.nan, 1, np.nan, -3, 2]) >>>obj.order() #在排序時,缺失值默認都會被放到Series的末尾. 4 -3 2 1 5 2 0 4 1 NaN NaN
注意:排名(Series.rank(method=‘average’,ascending=True))的作用與排序的不同之處在於,他會把對象的values替換成名次(從1 到 n)。這時唯一的問題在於如何處理平級項,方法裏的 method 參數就是起這個作用的,他有四個值可選:average,min, max, first。
-
-
- is_unique——屬性驗證是否是唯一的
-
彙總與統計
-
- sum(axis=1/0)——axis=1按照行求和
-
- mean(axis=1, skipna=False)——skipna選項可以避免行列存在NA得值進行計算
-
- idxmin和idxmax,達到最小值或最大值的索引
-
- describe——用於一次性彙總統計
處理缺失數據得方式
-
去除
-
填充