【python】將單元格中的多個數據拆分爲多行數據(explode方法使用)

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很是簡潔,但是在實際操作的過程中數據並沒有那麼簡單,而且在編程敲代碼中不要只習慣用一種編輯器,因爲沒有一種編輯器可以說是非常完美的,都存在優缺點,根據具體的需要選擇相應的編輯器即可

切記:敲代碼的初衷是解決問題,使得問題簡單化而不是複雜化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章