天天看點

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

DataFrame根據指定範圍的元素提取已有列資料中包含元素的資料并形成一列

  • ​​1 問題解釋​​
  • ​​2 測試資料​​
  • ​​3 測試代碼​​
  • ​​3.1 已有的資料​​
  • ​​3.2 指定範圍的資料​​
  • ​​3.3 比對資料​​
  • ​​4 結果驗證​​

1 問題解釋

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

題目讀完可能不是很好了解這個問題,那麼就列舉一個示例資料圖進行示範,如下。就是根據已有的資料,然後按照清洗的規定,會有一個指定的範圍,如果這個範圍裡面的資料是存在已有的資料裡面,那麼就把這個範圍中的元素提取出來,否則就是空,最後的資料長度和已有的資料長度相同

要求:

  • 三個資料:已有資料/指定的範圍資料/清洗後的資料
  • 限定條件:(1)被指定範圍中的元素如果在已有資料清單中,輸出指定範圍中的元素,如果不在就輸出空;(2)已有資料的資料量和被指定範圍的元素數量沒有要求,可以是已有的資料量多,也可以是被指定範圍的元素數量多;(3)清洗後的資料量必須等于已有的資料量

2 測試資料

如下的資料中,可以看出左側是對身體部位資料類型的名稱的中英文稱呼,最後面是出現的計數。其中①部分是包含②部分的,是以清洗資料中就有了上面的要求

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

已有資料就是上面截圖的内容,那麼指定範圍的資料就是第①部分所有身體部位組成的清單資料,最後就是根究這兩個資料進行篩選想要的結果

#被指定範圍的資料
ls = ['顱腦','面颌部','眼部','鼻','耳','口','頸部','胸部','腰部','腹部','脊柱','上肢','腕及手','下肢','踝及腳']      

3 測試代碼

3.1 已有的資料

從DataFrame中提取一列就是一個Series資料,其中資料量共有1212條

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

3.2 指定範圍的資料

按照國家标準GB6441-86對傷害部位進行分類,具體的分類如下。

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

故最終指定範圍的資料如下,共有15條資料

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

3.3 比對資料

具體的比對過程就是兩步,周遊得到是否存在的判斷和對應比對的元素,然後在根據判斷的結果将比對的元素填到對應位置,是以就可以封裝兩個函數進行

第一個函數就是完成第一步,第二個函數完成第二步

#對指定範圍的資料進行周遊,判斷是否在已有資料裡面
def test(s):
    for item in ls:
        if item in s:
            return True,item

#如果在已有資料裡面,就将比對的元素添加在對應的位置上      
def f(s):
    if test(s)[0]:
        return test(s)[1]

data_merge['test'] = data_merge['train'].apply(f)
data_merge['test']      

直接操作DataFrame中的一列,進行資料比對,可以發現最後的輸出結果也是1212條資料,和已有的資料量相同

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

單獨提取這兩列資料進行檢視,可以發現在顯示出來的内容中是完成了清洗比對

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

4 結果驗證

雖然最後篩選的資料量也是1212了,看似與已有資料量一緻,但是可能存在巧合的情況,是以就需要驗證一下是不是提取的準确無誤,就需要判斷test中的資料是不是每個單元格的資料都在train的單元格中,是以封裝一個函數進行驗證,代碼如下

#驗證比對是否正确
def verification(x1,x2):
    if x2 in x1:
        return True
    else:
        return False
data_merge['verify'] = data_merge.apply(lambda x: verification(x.train,x.test),axis= 1)
data_merge[['train','test','verify']]      

輸出結果為,在可見的肉眼中,都是True,最後隻需要确認一下verify一列的元素都是True,那麼就說明資料清洗比對成功了

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列

最後一步進行核實(可以看一下列中的元素唯一值,也可以對元素進行計數,後者前提要求資料中沒有空)

data_merge['verify'].unique()
data_merge['verify'].value_counts()      

輸出結果為:可以發現檢視元素的唯一值隻有True,計數也隻有一類而且資料量是1212,沒有缺失值,綜上就可以認為完成任務,資料清洗幹淨了

【python資料處理】DataFrame根據清單中的元素提取已知字段資料中包含元素的資料并形成一列