跳到主要內容

Python與SAS資料處理入門-變項合併與名稱修改

將舊有的變項合併創建新變項

在處理大數據時常常會遇到需橫跨多個資料庫間進行資料串連,因此可能會遇到幾個問題:
(1)不同資料庫間串連的鍵值欄位可能有多個,例如:ID與生日相同的資料才可互相串連。
(2)不同資料庫間串聯的鍵值不盡相同。
(3)要串聯的檔案之間有名稱相同的欄位,前幾篇文章有提到欄位合併的處理在SAS的語法上要注意檔案合併時欄位名稱相同會覆蓋的問題。

針對第1跟第2個問題,可先依據串聯不同資料庫鍵值的欄位需求先合併成一個unique id,後續直接用這個鍵值進行串連。合併後的新鍵值除了做為串檔用外,當資料處理時遇到原先鍵值不unique的情況,也會透過變項合併產生新的unique id來取代原先的id鍵值
對於問題3,檔案合併遇到命名相同的欄位產生相互覆蓋的問題,這部分會透過變更名稱的方式來處理。

以簡單例子進行練習
手上有2種檔案:
(1) 調查的基本資料,裡面包含IDGenderBirthdayCity(戶籍地)等資訊。


(2) 調查的結果,裡面包含IDBirthdayCity(收案地點)Q_date(受訪日期)以及問卷題項。

問題1: 鍵值不unique

觀察第一份資料可以發現ID編號為007的有兩個且生日不同,因此判定可能是不同的人,編號重複編列,在這樣的情況下如果僅用ID串聯結果可能會是這樣。

在基本資料(A)的那兩筆ID007的資料同時都會與調查結果(B)ID007那筆資料串連,但很明顯的是B資料的007合併生日判斷後可以發現不屬於A檔另一筆007的數據,因此原本uniqueID不為unique,因此合併IDBirthday成為一個新的unique ID做為鍵值。

問題2: 不同檔案有相同的名稱
這兩個檔案中有2個欄位名稱相同,BirthdayCity。在考量BirthdayID將合併為新鍵值後,可暫擱一邊不需特別處理。但City部分的問題就比較大了,雖名稱相同但實際上代表的含意不同,如果不予理會,直接進行串檔,在某些軟體上會遇到欄位名稱相同相互覆蓋的問題,導致操作者到最後也搞不清楚最後留下來的City欄位到底是來自於哪個檔案,必須再從頭檢視。
SAS進行變項合併
data test;set id_list;New_ID=ID || Birthday;run;

新產生的New_IDID+Birthday合併產生,但是中間有空格(框框處),如果不要中間有空格的問題,可使用compress函數處理。
data test;set id_list;New_ID=ID || compress(Birthday);run;


Python進行變項合併
這邊同樣使用pandas的套件就可以了~

id_list["New_ID"]= id_list["ID"].map(str)+ id_list["Birthday"].map(str) #如果欄位非文字變項需用map(str)做轉換



未將欄位轉換為文字及做合併,系統會直接當做數值相加,結果如下。

SAS進行變項名稱修改

data test;set id_list;rename City=City_list;run; /*舊名稱=新名稱*/

Python進行變項名稱修改
test=id_list.rename(columns={"City":"City_list"}) 
使用rename()函數變更名稱,這邊與SAS邏輯相同,同樣是舊名稱寫在前,變更後的新名稱寫在後。











留言

這個網誌中的熱門文章

如何快速註冊統合分析題目~以PROSPERO為例

初步檢索心中的愛 當心目中有一個理想題目時,為避免地球上另一個人也同時跟你想的一樣,而且還比我們早發表,若等我們發表時才發現,當下一定很扼腕,有了註冊系統除了幫自己先占好位子,也可以同時確認這個題目是否已經有人正在做了,不用浪費時間投注在上面。很多人其實不曉得實際上到底要如何註冊,以下一起註冊吧。 什麼是 PROSPERO??   PROSPERO (International prospective register of systematic reviews) 是一個國際前瞻性系統性文獻回顧評價系統,由美國國立衛生研究院 NIHR ( National Institute for Health Research )資助,由英國約克大學 CRD(Centre of Reviews and Dissemination) 創立,針對將已完成的評價或正進行中的計畫做紀錄。 目的:避免重複並減少報告偏見的機會,增加透明性。                 步驟流程 Step 1 :檢索主題 先確認其他人是否對這主題感興趣,有人捷足先登了嗎 ?? 也可以確認目前流行的趨勢是哪類型的研究等。 Step 2 :註冊帳號 ID 先到 PROSPERO 官網 ,填寫基本資料後註冊 ID 。 Step 3 :點選註冊文獻 review 要需先有帳號後才能註冊題目,進入頁面後依指示一步一步操作。 以下是網頁步驟,依研究對象是人群還是動物選擇按鈕點選,一般我們都是人群研究,選紫色。同時須確認以下五步驟是否都經過檢驗了。 第 1 步 檢查納入標準。 第 2 步 確保您的 protocol 處於(接近)最終形式。 第 3 步 搜尋 PROSPERO ,以確保評論尚未被註冊。 第 4 步 搜尋 PROSPERO ,以確保您沒有不必要地重複由另一個團隊進行的審核或先前已註冊的審核 第 5 步 開始註冊 Step 4 :點選相關事前準備工作進度。 這裡有一系列問題須皆回答完,才能進行下一步。 以上填完後,終於可以進入 Stage of review ,這裡依指示點選進度。 Step 5 :填寫註冊表格

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 進行資料歸人 歸人留 1 筆消費紀錄 cost.sort_v