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")