1. 背景與需求
在處理數據中,往往需要做多維特徵提取(一對多),如下:
一個企業會有多個擅長領域,爲了作多維度數據特徵分析,需要將‘企業畫像’中單元格的數據進行拆分成爲一行一個特徵的數據樣式,且其他列數據保持不變,簡單的demo(以隨機兩個公司爲例)如下
2. 問題解決
這裏需要使用pandas中的explode方法,注意此方法是在0.25.0版本之後纔有,所以確認當前的pandas版本是在此之上,查看某個庫的版本可以使用如下代碼
import pandas
print(pandas.__version__)
0.25.3 #當前的版本
2.1 官方示例
df.explode()
方法的使用代碼如下:
import pandas as pd
df = pd.DataFrame({'A': [[1, 2, 3], 'foo', [], [3, 4]], 'B': 1})
print(df)
print(df.explode('A'))
→ 輸出的結果爲:(會將一列的單元格數據進行拆分,注意數據的格式:列表裏面多個元素)
A B
0 [1, 2, 3] 1
1 foo 1
2 [] 1
3 [3, 4] 1
A B
0 1 1
0 2 1
0 3 1
1 foo 1
2 NaN 1
3 3 1
3 4 1
2.2 實際操作
首先導入庫,進行文件數據的讀取
import pandas as pd
data = pd.read_excel('data_ok.xlsx')
data.head(10)
→ 輸出的結果爲:(文件數據導入成功)
2.2.1 採坑
觀察官方給出的示例,爲了確保數據的格式一樣,先把格式化爲統一,因此就對‘企業畫像’這個字段進行數據處理
data['企業畫像'] = data['企業畫像'].apply(lambda x:[x.replace('、',', ')])
data.head(10)
→ 輸出的結果爲:(在jupyter notebook裏面這裏看上去是和官方是一致的)
然後在按照‘企業畫像’字段進行拆分數據,運行代碼及輸出的結果如下,會發現並沒有出現想要的結果
2.2.2 問題糾錯
碰巧的是我在spyder裏面運行相同的代碼,然後在調試的過程中,發現中間進行目標格式轉化時,spyder的變量查看器裏的數據格式是和jupyter notebook中不一樣(列表裏面只有一個元素)。當執行完數據格式轉化之後,spyder中的數據如下
區別在於,jupyter notebook在顯示數據的時候將代表字符串格式的引號省去了,但是spyder中是顯示出來了。 因此可以推測:雖然在jupyter notebook中數據看上去是一致的,但是格式上並沒有化爲一致,這也就是爲什麼直接explode之後並沒有出現我們想要的結果的原因,接下來的操作中證實了這個猜測
3. 問題解決
還是修改‘企業畫像’中單元格的數據格式,這次應該是將數據轉爲一個一個的元素,然後是列表的形式,就可以使用split方法,代碼及輸出結果如下:
然後爲了再次體現出差異性,將相同的代碼在spyder中運行,結果如下
然後再對比‘企業畫像’中的數據,可以發現之間的區別:jupyter notebook在顯示數據的時候會將引號省去,造成表面上數據格式的統一(也證實了之前的猜測),這次的數據格式是和官方示範的一樣了,接下來就是進行數據拆分了
在jupyter notebook中執行代碼如下:
在spyder中執行代碼如下:
最終完成數據清洗的要求,進行數據的多維特徵提取
4. 小結
官方示例給的demo很是簡潔,但是在實際操作的過程中數據並沒有那麼簡單,而且在編程敲代碼中不要只習慣用一種編輯器,因爲沒有一種編輯器可以說是非常完美的,都存在優缺點,根據具體的需要選擇相應的編輯器即可
切記:敲代碼的初衷是解決問題,使得問題簡單化而不是複雜化