Pandas數據分析之字符串處理

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第8天,點擊查看活動詳情

✔個人主頁:Mr.Darcy8的掘金主頁

🎉歡迎關注👀點贊👍收藏⭐留言📝以及交流人生哲理🎈學習心得🎁

引入

前段時間我們瞭解了pandas數據分析工具的一些函數妙用,並學習瞭如何製作一些簡單的圖表。

但細心的同學不難發現我們一直是在針對數字進行處理,這要求我們在統計獲取數據之初就對數據進行編碼。

但是實際生活中會出現很多無法統一標準的數據。

就拿當今最火的某電商平台為例,我們之前做過的數據分析是基於用户行為的,這些數據是有固定情況的(如當時我們用0代表瀏覽,1代表購買,2代表收藏,3代表加入購物車),此類數據只需要這樣編碼一下,賦予每種行為一個代數即可進行統計分析

而商品的款式呢?顏色呢?此類數據存在難以計數的情況,且可能實時更新,比如商家今天上新一個“霧霾藍”的雨傘,明天上新一個“普魯士藍”的帽子……

難道你要每新增一個商品就多加一個編碼嗎?每天數不清的商品新增,最終你是否需要為這些編碼準備一個數據庫,分析的時候查詢一下這個編碼代表的是什麼商品嗎?

顯然不現實。我們需要對此類數據直接進行字符串的處理。今天就不妨讓我們一起來看看吧~

一、字符數據導入與基本瞭解

我們這裏採用某大數據平台提供的電商平台商品數據當然,是帶有不規則字符串的

image.png

用文件的打開方式打開csv文件。

Tip:其實CSV文件本質上可以理解成是文本文件了,這個與xlsx等Excel帶格式的文件不一樣哈。

我們用len()函數看看一共有多少條記錄

image.png

a.columns()查看有多少個columns。可以理解成就是有多少個列,把這些列的名字列出來。

image.png

從這裏,細心的夥伴們可能就發現了,可以查看columns,那這個a是不是dataframe類型的數據啊~

image.png

答案是肯定的~我們仍舊可以用dataframe的操作方法來應用在這裏導入的csv字符串文件上。

image.png

我們在之前已經提到過,有許多商品的信息特徵是空值具體有多少空值我們是需要進行了解的,以免之後的處理遇到未知的問題——可以把這步視作數據清洗的前搖了: a.isnull().sum()#查看各個column有多少空值 isnull函數記錄是否為空值。sum()用於統計。

注意isnull運行過後,返回值是原dataframe同大小的一個新dataframe,每個單元格里是布爾型的數據

image.png

sum是在統計每個column中為True的個數

為什麼sum統計的是每個column的True的個數呢? - sum()函數默認豎向統計,因為通常情況下這樣更有意義(比如這裏豎向統計的是各個信息欄對應的空缺值,來看看哪個信息許多商家都沒填寫,從而為今後設置哪些必填信息提供決策參考。橫向的每條數據一般都是單位商品,如果統計的話就是看看各個商品都有哪些信息沒填,這樣統計起來數據量非常大,相當於大數據分析完了還是大數據。)如果你還是希望橫向統計每行的True的個數,可以設置sum的參數axis=1,這樣結果就是橫向統計了。 image.png

二、字符串處理

這裏只需要記住一點

Pandas字符串處理基本都是藉助str相關函數和方法實現的

image.png

這裏就是用常見的字符串處理方法。(文案我們採用字節跳動稀土掘金,親切感滿滿) - len函數統計長度返回數值 - split函數按特定字符分割字符串返回列表 - replace函數替換特點值 - find函數返回第一個特定字符的索引(注意索引從0開始)

三、基於生成序列的groupby

我們可以再次用groupby實現一些妙用。比如統計一些各個省份商品的數量:

image.png

a.location.str.split(" ",expand=True)[0].head() 我們可以分析一下這串代碼。

首先a.location很簡單,就是把dataframe的location列提取出來。

難道這樣就是各個商品的城市了嗎

我們發現有些商品有兩個城市

image.png

我們需要把首要城市提取出來,邏輯上比較合理些(好比你參加了一百篇SCI但是沒有一篇一作,你覺得周圍人會怎麼評價你)

於是我們採用.str把這個dataframe每行轉化成字符串,再用split函數以空格為界把兩個城市提取出來,此時城市已經成為含有多個元素的列表。設置參數expand=true可以使數據類型變回dataframe。最後用列表索引[0]把最前面的城市分別提取出來即可。

image.png

一次groupby的妙用,按a.location.str.split(" ",expand=True)[0]來分組,這就是小標題説的基於序列的groupby。最後size()統計之後就可以獲得每個城市的數據了。這樣的數據比較整潔且有意義

——你説為什麼這麼麻煩?直接groupby函數傳入location作為參數不行嗎?

image.png

如圖,每個城市組合都作為一個分組,這樣大夥兒能看出來哪個城市商品最多嗎?

新人上路,歡迎互相幫扶~Mr_darcy8的掘金主頁

可以的話給咱點個讚唄💖