DataFrame根據指定範圍的元素提取已有列資料中包含元素的資料并形成一列
- 1 問題解釋
- 2 測試資料
- 3 測試代碼
- 3.1 已有的資料
- 3.2 指定範圍的資料
- 3.3 比對資料
- 4 結果驗證
1 問題解釋

題目讀完可能不是很好了解這個問題,那麼就列舉一個示例資料圖進行示範,如下。就是根據已有的資料,然後按照清洗的規定,會有一個指定的範圍,如果這個範圍裡面的資料是存在已有的資料裡面,那麼就把這個範圍中的元素提取出來,否則就是空,最後的資料長度和已有的資料長度相同
要求:
- 三個資料:已有資料/指定的範圍資料/清洗後的資料
- 限定條件:(1)被指定範圍中的元素如果在已有資料清單中,輸出指定範圍中的元素,如果不在就輸出空;(2)已有資料的資料量和被指定範圍的元素數量沒有要求,可以是已有的資料量多,也可以是被指定範圍的元素數量多;(3)清洗後的資料量必須等于已有的資料量
2 測試資料
如下的資料中,可以看出左側是對身體部位資料類型的名稱的中英文稱呼,最後面是出現的計數。其中①部分是包含②部分的,是以清洗資料中就有了上面的要求
已有資料就是上面截圖的内容,那麼指定範圍的資料就是第①部分所有身體部位組成的清單資料,最後就是根究這兩個資料進行篩選想要的結果
#被指定範圍的資料
ls = ['顱腦','面颌部','眼部','鼻','耳','口','頸部','胸部','腰部','腹部','脊柱','上肢','腕及手','下肢','踝及腳']
3 測試代碼
3.1 已有的資料
從DataFrame中提取一列就是一個Series資料,其中資料量共有1212條
3.2 指定範圍的資料
按照國家标準GB6441-86對傷害部位進行分類,具體的分類如下。
故最終指定範圍的資料如下,共有15條資料
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條資料,和已有的資料量相同
單獨提取這兩列資料進行檢視,可以發現在顯示出來的内容中是完成了清洗比對
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,那麼就說明資料清洗比對成功了
最後一步進行核實(可以看一下列中的元素唯一值,也可以對元素進行計數,後者前提要求資料中沒有空)
data_merge['verify'].unique()
data_merge['verify'].value_counts()
輸出結果為:可以發現檢視元素的唯一值隻有True,計數也隻有一類而且資料量是1212,沒有缺失值,綜上就可以認為完成任務,資料清洗幹淨了