Python筆記--Pandas常用函數匯總
【pandas統計分析】
- 讀取數據
資料庫數據讀取/存儲:
import pymysqlfrom sqlalchemy import create_engineconn = create_engine(mysql+pymysql://root:123456@localhost:3306/databasename?charset=utf8) sql = select * from tb_namedf = pd.read_sql(sql=sql,con=con,index_col=True,coerce_float=True,columns=True)或者:df = pd.read_sql_table(tablename,con=con,index_col=True,coerce_float=True,columns=True)# sql--查詢語句 ,con--資料庫連接信息(地址,用戶名,密碼,資料庫名稱) index_col--設定的列作為行名,默認為None ,coerce_float--將資料庫中的decimal的數據 轉換為pandas里的float64類型,默認為True ,columns--讀取數據的列名,默認為None將表存入mysql:pd.io.sql.to_sql(df,tablename,con=con,if_exists=fail)# if_exists的參數有fail(如果表存在,則不寫入),replace(代替原來的表),append(在原來的表上 追加數據)
文本文件,csv文件讀取/存儲:
pd.read_table(filepath,sep=/t,header=infer,names=None,index_col=None, dtype=None,encoding=utf-8,nrows=None)pd.read_csv(filepath,sep=,,header=infer,names=None,index_col=None, dtype=None,encoding=utf-8,nrows=None)# header--將某行數據作為列名,默認infer,表示自動識別 names--接受array,自定義列名 nrows表示讀取前n行,默認為Nonedf.to_csv(path_or_buf,sep=,,na_rep=,columns=None,header=True,index=True, index_label=None,mode=w,encoding=utf-8)# path_or_buf--存儲的路徑 na_rep--代表缺失值 columns--寫出的列名 header--是否將列名 寫出 mode--數據寫入模式,默認『w』
excel文件讀取/存儲
pd.read_excel(filepath,sheetname=,header=infer,names=None,index_col=None, dtype=None)# sheetname--接受string,int,數據表的位置,默認0 header--將某行作為列名,默認infer names--接受array,自定義列名 df.to_excel(excel_writer,sheetname=,na_rep=,header=True,index=True, index_label=None,mode=w,encoding=utf-8)# excel_writer--存儲文件路徑 sheetname--sheet表名,默認sheet1
2. DataFrame的增刪改查
2.1 查看DataFrame:
df.values # 查看所有元素df.index # 查看索引df.columns # 查看所有列名df.dtype # 查看欄位類型df.size # 元素總數df.ndim # 表的維度數df.shape # 返回表的行數與列數df.info # DataFrame的詳細內容df.T # 錶轉置
2.2 查看訪問DataFrame中的數據
2.2.1 基本查看方式:
單列數據:df[col1]單列多行:df[col1][2:7]多列多行:df[[col1,col2]][2:7]多行數據:df[:][2:7]前幾行: df.head()後幾行: df.tail()
2.2.2 loc,iloc的查看方式(大多數時候建議用loc)
# loc[行索引名稱或條件,列索引名稱]# iloc[行索引位置,列索引位置]單列切片:df.loc[:,col1] df.iloc[:,3]多列切片:df.loc[:,[col1,col2]] df.iloc[:,[1,3]]花式切片:df.loc[2:5,[col1,col2]] df.iloc[2:5,[1,3]]條件切片:df.loc[df[col1]==245,[col1,col2]] df.iloc[(df[col1]==245).values,[1,5]]
2.3 更改某個欄位的數據:
df.loc[df[col1]==258,col1]=214# 注意:數據更改的操作無法撤銷,更改前最好對條件進行確認或者備份數據
2.4 增加一列數據:
df[col2] = 計算公式/常量
2.5 刪除數據:
# 刪除某幾行數據,inplace為True時在源數據上刪除,False時需要新增數據集df.drop(labels=range(1,11),axis=0,inplace=True)# 刪除某幾列數據df.drop(labels=[col1,col2],axis=1,inplace=True)
3. DataFrame的描述分析
#數值型:df[[col1,col2]].describe()#類別型:df[col1].value_counts()[0:10]#category型:df[col1] = df[col1].astype(category)df[col1].describe()
4. 處理時間序列數據
4.1 轉換字元串時間為標準時間:
df[time] = pd.to_datetime(df[time])
4.2 提取時間序列信息
year = df[time].year()# year-年,month-月,day-天,hour-小時,minute-分鐘,second-秒,date-日期,time-時間 week-一年中第幾周,quarter-季節,dayofweek-一周中第幾天,weekday_name-星期名稱
4.3 加減時間:
# 使用Timedelta,支持weeks,days,hours,minutes,seconds,但不支持月和年df[time] = df[time] + pd.Timedelta(days=1)df[time] = df[time] - pd.to_datetime(2016-1-1)# 時間跨度計算:df[time].max() - df[time].min()
5. 使用分組聚合
5.1 使用groupby拆分數據並計算:
df.groupby(by=,axis=0,level=None,as_index=True,sort=True,group_keys=True ,squeeze=False).count()# by--分組的欄位 level--標籤所在級別,默認None as_index--聚合標籤是否以df形式輸出, 默認True,sort--是否對分組依據,分組標籤進行排序,默認True group_keys--是否顯示分組 標籤名稱,默認True squeeze--是否對返回數據進行降維,默認False# 聚合函數有count,head,max,min,median,size,std,sum
5.2 使用agg聚合數據:
# 求出當前數據的統計量df[[col1,col2]].agg([np.mean,np.sum])# 分別求欄位的不同統計量df.agg({col1:np.sum,col2:np.mean})# 求不同欄位不同數目的統計量df.agg({col1:np.sum,col2:[np.mean,np.sum]})
5.3 使用transform聚合數據:
# 實現組內數據離差標準化dfgroup.transform(lambda x:(x.mean()-x.min())/(x.max()-x,min()))
6.創建透視表與交叉表
6.1使用pivot_table創建透視表
pd.pivot_table(data,index=,columns=,values=,aggfunc=mean, fill_value=None,margins=True,dropna=False)# data為表,index為行分組鍵,columns為列分組鍵,values為要聚合的欄位,aggfunc為聚合 函數,默認為mean,fill_value為指定填充缺失值,margins為是否顯示匯總,默認為True dropna為是否刪除全部為NaN的列,默認False
6.2使用crosstab創建交叉表
dfcross = pd.pivot_table(index=df[col1],columns=df[col2],values=df[col3], aggfunc=mean,colnames=None,rownames=None,margins=True,dropna=False, normalize=False)# colnames表示列分組鍵名,無默認 rownames表示行分組鍵名,無默認 normalize表示是否對數據進行標準化,默認False
【數據預處理】
1.合併數據
1.1 橫向合併數據:
pd.concat([df1,df2,df3],axis=1,join=inner,ignore_index=False,keys=None, levels=None,names=None,verify_integrity=False)# 當axis=1時,concat作行合併,join參數為inner(交集)和outer(並集),默認為outer ignore_index,keys,levels,names,verify_integrity這幾個參數不常用,設為默認即可
1.2 縱向合併數據
# 使用concat合併pd.concat([df1,df2,df3],axis=0,join=inner,ignore_index=False,keys=None, levels=None,names=None,verify_integrity=False) # 使用append合併,前提條件是兩張表的列名需完全一致df1.append(df2,ignore_index=False,verify_integrity=False)
1.3 主鍵合併數據(表聯接)
# 使用merge合併:pd.merge(left,right,how=inner,on=None,left_on=None,right_on=None, left_index=False,right_index=False,sort=False, suffixes=(_x,_y),copy=True,indicator=False)# left和right為聯接的表1和表2,how為聯接的方式(inner,outer,right,left),默認inner left_on為表1的主鍵,right為表2的主鍵,left_index為是否將表1的index作為主鍵,默認False sort為是否根據連接鍵對合併後的數據進行排序,默認False,suffixes為合併後數據列名相同的 後綴,默認(_x,_y)。# 使用join進行合併,前提是倆張表的主鍵的名字必須相同df1.join(df2,on=None,how=inner,lsuffix=,rsuffix=,sort=None)# lsuffix為合併後左側重疊列名的後綴,rsuffix為合併後右側重疊列名的後綴
1.4 重疊合併數據:
倆張表的內容幾乎一致,但某些特徵在一張表上是完整的,但在另外一張表上是缺失的
df1.combine_first(df2)
2. 清洗數據(重複值,缺失值,異常值)的處理:
2.1重複值的檢測及處理:
# 判斷某個欄位是否有重複值len(df.col1.unique()) #將返回值與len(df.col1)進行比較# 記錄重複處理:df.drop_duplicates(subset=[col1,col2],keep=first,inplace=False)# subset為需要去重複的列,keep參數有first(保留第一個),last(保留最後一個), false(只要有重複都不保留) inplace為是否在源數據上操作,默認False
2.2 缺失值的檢測及處理
# 判斷欄位是否有缺失df.isnull().sum() 或 df.notnull().sum()# 缺失值處理--刪除:df.dropna(axis=1,how=any,inplace=False)# axis為1是刪除列,為0時刪除行 how參數為any(只要有缺失值存在就刪除),all(全部為缺失值 時才刪除,默認為any inplace為是否在源數據上操作,默認為False# 缺失值處理--替換法# 替換數值型欄位時,常用平均數,中位數,替換類別性欄位時,常用眾數df.fillna(value=None,method=None,axis=1,inplace=False,limit=None)# method參數為ffill(用上一個非缺失值填充),bfill(用下一個非缺失值來填充)# 缺失值處理--插值法# 線性插值:from scipy.interpolate import interpltx=np.array(df[col1])y=np.array(df[col2])linearInsValue = interplt(x,y,kind=linear)linearInsValue([6,7])# 拉格朗日插值:from scipy.interpolate import lagrangex=np.array(df[col1])y=np.array(df[col2])largeInsValue = lagrange(x,y)largeInsValue([6,7])# 樣條插值:from scipy.interpolate import splinex=np.array(df[col1])y=np.array(df[col2])splineInsValue = spline(x,y,xnew=np.array([6,7]))# 線性插值法需要x與y存在線性關係,效果才好,大多數情況下,用拉格朗日法和樣條插值法較好
2.3 異常值的檢測及處理
# 使用3σ原則識別異常值,不過該原則只對正態分布或近似正態分布的數據有效def outRange(ser1): boolInd = (ser1.mean()-3*ser1.std()>ser1)|(ser1.mean()+3*ser1.std()<ser1) index = np.arange(ser1.shape[0])[boolInd] outRange = ser1.iloc[index] return outRangeoutlier = outRange(df[col1])len(outlier)# 用箱線圖來分析異常值import matplotlib.pyplot as pltplt.figure(figsize=(10,7))p = plt.boxplot(df[col1].values,notch=True)outlier = p[fliers][0].get_ydata()plt.show()len(outlier)
3. 數據標準化
3.1 離差標準化數據(區間縮放)
# 自定義離差標準化函數def MinMaxScale(data): data = (data-data.min())/(data-data.max()) return datadf[col1_scale] = MinMaxScale(df[col1])
3.2 標準差標準化數據
# 自定義標準差標準化函數def StandardScale(data): data = (data-data.mean())/data.std() return datadf[col1_scale] = StandardScale(df[col1])
3.3 小數定標標準化數據:通過移動數據的小數位數,將數據映射到區間【-1,1】
# 自定義小數定標標準化數據def DecimalScale(data): data = data/10**np.ceil(np.log10(data.abs().max())) return datadf[col1_scale] = DecimalScale(df[col1])
離差標準化缺點為若數據集中某個數據值很大,則離差標準化的值就會趨近於0,並且相互之間差別不大。但方法簡單,便於理解。標準差標準化受數據分布的影響較小,小數定標標準化的適用範圍更廣。
4.數據的轉換
4.1 啞變數處理
pd.get_dummies(data,prefix=None,prefix_sep=_,dummmy_na=False,columns=None)# prefix為啞變數後列名的前綴,默認為None dummy_na為是否需要為NaN值添加一列,默認None columns默認為None,表示對所有的object和category類型的欄位進行處理
4.2 連續型數據離散化(分箱處理)
# 等寬法:對數據分布要求較高,若數據分布非常不均勻,這種方法不合適pd.cut(df[col1],bins=5,labels=,precision=3)# bins為離散化後的類別數目,labels為離散化後各個類別的名稱,默認為空 precision是標籤精度 默認為3# 等頻法:def SameRateCut(data,k): w = data.quantile(np.arange(0,1+1.0/k,1.0/k)) data = pd.cut(data,w) return dataresult = SameRateCut(df[col1],5).value_counts()
推薦閱讀:
※Kaggle 數據清洗挑戰 Day 3 - 快速解析日期(date)數據
※在線音樂行業報告 ——以網易雲音樂為例
※數據分析小白的進階之路
※苦沙:建站研究 12:運營人員應該從哪些數據維度去分析平台表現?