跳到主要內容

發表文章

目前顯示的是有「資料處理」標籤的文章

python與SAS資料處理-歸人與排除重複

  歸人顧名思義就是將一個人多筆的資料整合,每人只留下 1 筆。   通常取得的資料都是原始資料,並未經過整理。例如手上有疑份顧客購物紀錄,裡面有每個顧客在這 1 年內的每筆消費紀錄,這是一份以每次消費紀錄為 1 筆的紀錄形式,所以一個人可以有多筆的消費紀錄。當我們想要知道這些消費紀錄源自於多少顧客的購買時,這時候就需要用到歸人的概念,將資料轉換為每一個人只有 1 筆資料的紀錄形式 ( 如下圖所示 ) 。 以 SAS 進行資料歸人 歸人留 1 筆消費紀錄 proc sort data =cost; by ID time; run ; /* 在規筆前依照 ID 跟消費日期做排序 */ data cost_1; set cost; by ID; if first.id; run ;   /* 保留第一筆資料 */   之前已經有針對 proc sort 的排序語法進行說明,有需要可參考這篇 文章 , SAS 排序的設定值為升冪,也就是說每個人都會從最早那次的紀錄開始往後排序,所以用 first.id 就可以留下每個人最早那次的消費紀錄。 這邊也可以用排除重複的概念保留 1 筆資料 proc sort data =cost out =cost_2 nodupkey ; BY ID; run ; 利用 nodupkey ,將 ID 重複的資料刪除,僅保留每個 ID 第一次出現的該筆紀錄。   歸人累計所有消費金額 proc sort data =cost; by ID time; run ; data cost_1; set cost; by ID; if first.id then count= 0 ;/* 每個人第一筆資料都令 count=0*/ count+NT;/* 同 ID 累計 NT 數值 */ if last.id; run ;   除了要歸人以外,還要累計每個仁所有的消費金額,所以這邊就會創建一個 count 欄位,每一個人的第一筆 ID 令 count=0 ,在同樣 ID 時累加 NT 的數值,最後每個人保留最後一筆 ID ,也就是最後累計的總額。 以 Python 進行資料歸人...

python與SAS資料處理入門--條件限制(邏輯判斷)

  運用邏輯判斷進行資料篩選,這也是資料處理中重要的環節。   資料清理時經常會需要篩選或是排除某些條件下的資料,最簡單的例子就是當原始資料的年齡為 0-99 歲時,但所需要用於後續分析的資料只需留下 20-30 歲的數據時,就需要用到邏輯判斷進行資料篩選。 一般在 SAS 上會使用 IF+ 邏輯條件來進行判斷, python 則較為不同,以下分別做示範。   以 SAS 進行邏輯判斷 單一條件,篩選出性別為男性的資料 data id_m; set id; if gender= "M" ; run ; /* 用保留的邏輯判斷留下性別為男性的資料 */ (1) 大小寫:這邊要注意欄位裡面的 coding 方式, 大小寫有差別 ,如果寫成 if gender= "m" ,那這樣不會留下我們想要的資料了。 (2) 文字欄位條件,需要加上 雙引號 。   也可以用排除的方式留下資料 : data id_m; set id; if gender= "F" then delete ; run ; /* 用排除的方式保留資料 */ 這兩種寫法都可以,但是在某些情況下結果會有差異,當我們很確認欄位的 coding 只有 F 跟 M 時,這兩個寫法得到的結果會相同,但如果欄位中有其他 coding 或是 missing value 時,後面的寫法只會將性別 coding 為 F 的資料排除,所以如果裡面包含 missing value 則會一同被留下,所以使用上大家依據需求採用最恰當的寫法。 多重條件,篩選出性別為男性且年齡 <50 的資料 data id_m; set id; if gender= "M" and age< 50 ; run ; 利用 and 或 or 連接多個條件,進行邏輯判斷。 以 Python 進行邏輯判斷 單一條件,篩選出性別為男性的資料 id_m=id_list[id_list["Gender"].isin(["M"])] 不過 pandas 中只有 isin 指令,所以如果是要用排除的方式就必須要繞路執行,先把要做判斷的...

Python自動化--複製Excel工作表至另一個Excel上

  Python 可以協助處理大量重複性工作,將 Excel 上的工作表自動化複製至上百個不同的 Excel 檔案上   實務上可能會遇到必須將一個 Excel 工作表複製到不同的 Excel 檔案上的情況,一般而言利用 Excel 移動或複製工作表的功能也能處理,但是當這個動作必須執行上百次,移動到上百個不同的 Excel 檔案時,就必須耗時的一個一個執行重複性工作,然而利用 Python 就可以輕鬆簡單化這項工作。   不過 Excel 檔案因儲存的格式可分為 xlsx( 一般版本 ) 跟 xls( 相容版本 ) ,這兩個版本在 Python 處理上需要使用不同的套件處理,這次就以相容版本為例進行示範,有興趣或是有需要的人可以再去搜尋 其他版本的處理。   操作範例 : 假定手上有來自於不同地方的 20 個資料檔案,這些資料都適用一致的編碼方式,為了避免之後時間久了產生混亂,因此必須將這份編碼表分別插入這 20 份資料中,讓每份檔案都有一份編碼表可以參閱,編碼表如下所示。 這邊會用到 3 個套件,開始執行前,尚未安裝 xlrd 、 xlwt 及 xlutils 者需要先安裝,在 Window 環境下,開起命令提示字元,輸入 pip install xlrd 、 pip install xlwt 以及 pip install xlutils ,安裝完成後,開始執行後續的程式碼。 import xlrd import xlwt from xlutils.copy import copy def replace_xls(sheetname): table = xlsx.sheet_by_name(sheetname) rows = table.nrows cols = table.ncols worksheet = wb2_1.add_sheet(sheetname) for i in range(0,rows): for j in range(0, cols): # print(i,j,table.cell_value(i, j)) worksheet.write(i, j ,ta...

python與SAS資料處理入門--格式轉換

  當匯入的資料格式並非分析時所需的格式時,就需要事先進行轉換。   舉個最常見的例子,在資料處理時常常會遇到日期資料以為文字格式做儲存,如下圖所示,生日的部分為文字格式並非日期格式,分析上往往需要的是年齡變項,必須透過生日計算年齡。但是當 Birthday 變項為文字格式時,在計算上就會遇到困難,必須優先進行格式轉換的處理。 以下的操作就以生日欄位為例進行格式轉換。 以 SAS 進行日期格式轉換 基礎版,用 substr 做擷取 data id_date; set id; Birth_date=mdy(substr(Birthday, 5 , 2 ),substr(Birthday, 7 , 2 ),substr(Birthday, 1 , 4 )) ; format Birth_date yymmdd10. ; run ;   進階版,用 input 直接轉換 data id_date; set id; Birth_date=input(Birthday, yymmdd8. ) ; format Birth_date yymmdd10. ; run ;   以 Python 進行日期格式轉換 id_list["Birth_date"] = pandas.to_datetime(id_list["Birthday"], format = '%Y%m%d') #format之後設定日期格式 當然,實務上會遇到需要轉換成不同形式的日期格式,並不會種是這麼單純,因此以下彙整 SAS 與 python 日期格式的表示。   Python 程式 年 %Y 4 位數的年 %y 2 位數的年 月 %m 2 位數的月 [01,12] %b 英文月份簡寫 %B 英文月份完整寫法 日 %d 2 位數的日 ...