1. 程式人生 > >Python-資料分析-Pandas統計分析基礎2

Python-資料分析-Pandas統計分析基礎2

     前些日子一直在忙實驗,結束後又去忙其他事情,看完了Pandas一直沒有時間寫筆記,今天忙裡偷閒再寫一篇Pandas

     DataFrame是最常用的Pandas物件,類似於Microsoft Office Excel表格,完成資料讀取後,DataFrame資料結構儲存在記憶體中。好在對Pandas進行試驗後會得知哪些方法更常用更重要,對出現的問題也知道如何更好的解決。

1.檢視DataFrame的常用屬性

from sqlalchemy import create_engine
import pandas as pd
#建立資料庫連結
engine = create_engine("mysql+pymysql://root:
[email protected]
:\3306/testdb?charset=utf8") detail = pd.read_sql_table("meal_order_detail1",con=engine) print("訂單詳情表的索引為:",detail.index) print("訂單詳情表大的所有值為:",detail.values) print("訂單詳情表的列名為:","\n",detail.columns) print("訂單詳情表的資料型別為:","\n",detail.dtypes) print("訂單詳情表的元素個數為:",detail.size) print("訂單詳情表的維度數為:",detail.ndim) print("訂單詳情表的形狀為:",detail.shape) print("訂單詳情錶轉置後的形狀為:",detail.T.shape)

    注意:這裡最重要的是detail.shape

2. 訪問DataFrame中的資料

    (1).DataFrame中單獨一列為一個Series類,可以通過DataFrame["列名"]的方式訪問,這是通過字典的方式進行訪問。

         也可以對多列直接進行訪問:DataFrame2 = DataFrame1[["列名1","列名2"]][a:b]

         通過head()函式和tail()函式也可以直接訪問前幾行或後幾行:DataFrame.head(X)  即訪問前X行,tail()函式同理

    (2).可以通過iloc()函式和loc()函式對DataFrame進行切片

         兩者不同的區別在於loc()函式要求的是行索引名稱和列索引名稱,iloc()函式接收的是行索引和列索引位置

         有的時候傳表示式,返回布林型別會報錯,因為iloc()函式或loc()函式無法把布林型別的值當作索引,這時候在表示式後加.values即可解決問題,例如:

detail.iloc[detail["order_id"]=="458",[1,5]]
#這麼寫會報錯,因為第一個引數是boolean型

detail.iloc[(detail["order_id"]=="458").values,[1,5]]
#這樣寫即可

    (3). ix()方法

        ix()方法更像是iloc()和loc()方法的融合,兩種型別的引數都可以接收。

        需要注意的是索引名稱和位置存在部分重疊的時候,ix預設優先識別名稱。注意的是這種方法已經不被推薦(Deprecated),且面對大量資料時效率低於iloc和loc函式。日常使用中不推薦使用ix函式而推薦使用loc函式或iloc函式。

        如果一定要使用ix函式,使用時儘量保持行索引名稱和行索引位置重疊,使用時就無需考慮取值區間的問題。一律為閉區間。使用列索引名稱,而非列索引位置,來保持程式碼的可讀性。使用索引位置時要記得添加註解。

3. 修改DataFrame中的資料

       直接訪問後重新賦值即可修改。注意的是修改時是在DataFrame上直接修改,最好進行資料備份。

4. 在DataFrame中新建一列

       新建一列只需要新建一個列索引並對其進行賦值

detail["payment"] = detail["count"]*detail["amount"]

5. 刪除DataFrame中的資料

     使用drop方法:

drop(labels,axis=0,level=None,inplace=False,errors="raise")

     labels接收行或列的標籤,無預設。  axis=0或1,代表軸的方向,與Numpy一樣,0表示列,1表示行,預設0

     inplace接收boolean,代表是否對原資料生效,預設False

6.在DataFrame中進行資料分析

     可以使用Numpy中的方法,具體見:

     Pandas還提供了一種方法describe(),可以依次輸出DataFrame中所有數值型特徵的非空值數目、均值、四分位數、標準差

     初次之外,Pandas也提供了相關的與統計有關的方法:

    有的資料型別不是數值,無法使用describe函式。可以用astype方法將資料型別轉化為category型別,describe函式可以對category型別的數值進行統計,輸出列非空元素的數目,類別的數目,數目最多的類別,數目最多類別的數目。

    describe函式分析後,可以發現有的列全為空,通過一下方法可以去除:

def dropNullStd(data):
   beforelen = data.shape[1]
   colisNull = data.describe().loc["count"] == 0;
   for i in range(len(colisNull)):
       if colisNull[i]:
           data.drop(colisNull.index[i],axis=1,inplace=True)
   stdisZero = data.describe().loc["std"] == 0
   for i in range(len(stdisZero)):
       if stdisZero[i]:
           data.drop(stdisZero.index[i],axis=1,inplace=True)
   afterlen = data.shape[1]
   print("去除的列的數目為:",beforelen-afterlen)
   print("去除後資料的形狀為:",data.shape)

7.轉換字串為標準時間

   (1). Pandas提供to_datetime函式把String類轉換為Timestamp類

order["lock_time"] = Pandas.to_datetime(order["lock_time"])

     注意:Timestamp型別的資料是有限制的,最早為1677-09-21 00:12:43.145225,最晚為2262-04-11 23:47:16.854775807

     Timestamp類可以用引數調取詳細的時間資訊:

      (2). DatetimeIndex函式與PeriodIndex函式

          除了從原始DataFrame中直接轉換為Timestamp格式外,還可以單獨轉換成DatetimeIndex或者PeriodIndex

dateIndex = Pandas.DatetimeIndex(order["lock_time"])

periodIndex = Pandas.PeriodIndex(order["lock_time"],freq="S")
# Y為年 M為月 D為日 H為小時 T為分鐘 S為秒

      (3). Timedelta類

          Timedelta類不僅能夠使用正數,還可以使用負數表示時間。使用Timedelta類可以輕鬆地實現某個時間加減一段時間。

time1 = order.iloc[1,2].to_datetime+Pandas.Timedelta(days = 1)

          使用Timedelta實現時間的平移外,還能夠直接對兩個時間序列進行相減,得到一個Timedelta類

time = Pandas.to_datetime("2018-09-28")-Pandas.to_datetime("2018-9-26")