人生苦短,我用 Pythonhtml
前文傳送門:python
小白學 Python 數據分析(2):Pandas (一)概述程序員
小白學 Python 數據分析(3):Pandas (二)數據結構 Seriesgithub
小白學 Python 數據分析(4):Pandas (三)數據結構 DataFramesql
小白學 Python 數據分析(5):Pandas (四)基礎操做(1)查看數據數據庫
小白學 Python 數據分析(6):Pandas (五)基礎操做(2)數據選擇api
小白學 Python 數據分析(7):Pandas (六)數據導入數據結構
上一篇咱們介紹了數據導入,在進行分析以前,還有一個比較重要的步驟就是數據的預處理,不少時候,咱們導入的數據質量並不高,會有不少不達標的數據。spa
這就和咱們天天作飯是同樣的,買回來的菜總歸會有一些不太好的部分,咱們須要在作飯以前對這些菜作一些預處理,將很差的部分處理掉。
常見的數據問題主要有缺失數據、重複數據以及異常數據這麼幾種,在開始進行數據分析以前,咱們須要先把這部分的數據處理掉。
缺失數據其實就是因爲某些鮮爲人知的緣由致使的部分數據爲空,關注點不要放在鮮爲人知的緣由是啥上哈,這種緣由簡直多了去了,任何一位程序員都能舉出來無數種例子。
對於這種部分爲空的數據咱們一般有兩種處理方式,一種是直接刪除,還有一種是填充某種設定值。
固然,選用哪一種方式徹底是看具體的業務場景。
首先,第一步固然是把缺失的數據找出來, Pandas 找缺失數據可使用 info()
這個方法(這裏選用的數據源仍是前面一篇文章所使用的 Excel ,小編這裏簡單的隨機刪除掉幾個數據):
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df)
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
1 juejin NaN 0 -2.0 1 2019-11-23 23:00:03
2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[408 rows x 6 columns]
print(df.info())
# 輸出結果
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 408 entries, 0 to 407
Data columns (total 6 columns):
plantform 408 non-null object
read_num 406 non-null float64
fans_num 408 non-null int64
rank_num 407 non-null float64
like_num 408 non-null int64
create_date 408 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(2), int64(2), object(1)
memory usage: 19.2+ KB複製代碼
從結果中能夠看到,不爲空的行數共計 408 行,而 read_num
這一行爲 406 ,說明小編在這一列刪掉了 2 個數據,在 rank_num
這一列刪掉了 1 個數據。
咱們還可使用另外一個更加直觀的方式來獲取缺失的數據 isnull()
,若是是缺失的值,會返回 True ,若是不是則會返回 False :
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.isnull())
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 False False False False False False
1 False True False False False False
2 False False False False False False
3 False False False True False False
4 False False False False False False
.. ... ... ... ... ... ...
403 False False False False False False
404 False False False False False False
405 False False False False False False
406 False False False False False False
407 False False False False False False
[408 rows x 6 columns]複製代碼
使用 isnull()
是比較直觀,那麼這裏存在一個問題,就是好像數據顯示不全啊,這種問題小 case ,只需一行代碼輕鬆解決:
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
pd.set_option('display.max_rows', None)
print(df.isnull())複製代碼
只須要對 pd 的顯示設置下最大行數就好,結果稍微有點長,小編就不貼了。
咱們找到了缺失的數據,接下來就是對這部分數據進行刪除操做了, Pandas 一樣爲咱們提供了一個現成的方法 dropna()
。
dropna()
這個方法會默認刪除缺失數據的行,就是這一行只要有缺失數據,整行都會刪除:
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.dropna())
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
5 csdn 2202.0 129 0.0 37 2019-11-22 23:00:01
7 csdn 1621.0 76 0.0 27 2019-11-21 23:00:02
.. ... ... ... ... ... ...
403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[405 rows x 6 columns]複製代碼
能夠看到,這裏顯示的行數只剩 405 行了,其中有 3 行有缺失的數據已經刪除了。
在刪除缺失行的時候還會有一種狀況,就是整行數據全都缺失,咱們還能夠只刪除整行數據全缺失,若是隻是有缺失值的數據保留,這時咱們能夠用到 dropna()
的一個參數 how="any"
:
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.dropna(how="any"))
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
1 juejin NaN 0 -2.0 1 2019-11-23 23:00:03
2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[408 rows x 6 columns]複製代碼
由於小編的數據沒有整行缺失的,能夠看到這裏又打印了全部的數據。
固然, dropna()
同時支持各類條件刪除,這裏篇幅緣由小編就不一一列舉了,有須要的同窗能夠訪問官方文檔查看:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html 。
前面咱們介紹了缺失數據的刪除,可是數據是很寶貴的,一般狀況下確定不能作簡單的刪除操做,更多的時候咱們是但願能填充咱們想要的默認值,這裏咱們能夠用到 fillna()
這個方法。
例如咱們在剛纔的數據中補充 0 :
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.fillna(0))
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
1 juejin 0.0 0 -2.0 1 2019-11-23 23:00:03
2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
3 cnblog 650.0 3 0.0 0 2019-11-22 23:00:15
4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[408 rows x 6 columns]複製代碼
上面的示例是將全部的缺失數據全都填充成了 0 ,可是若是咱們只想填充其中的一列數據呢?
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.fillna({'read_num': 10}))
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
1 juejin 10.0 0 -2.0 1 2019-11-23 23:00:03
2 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
3 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
4 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
403 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
404 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
405 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
406 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
407 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[408 rows x 6 columns]複製代碼
爲了便於區分,小編這裏只補充了 read_num
這一列,將默認填充數值補充成了 10 。
重複數據是指相同的記錄有多條,這裏通常簡單的作刪除操做。
Pandas 爲咱們提供了 drop_duplicates()
方法用做重複值處理,默認會對全部值進行判斷,而且會默認保留第一個值。
爲了演示,小編將 Excel 中的數據第一行復制了一條。
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df)
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
1 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
2 juejin NaN 0 -2.0 1 2019-11-23 23:00:03
3 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
4 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
.. ... ... ... ... ... ...
404 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
405 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
406 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
407 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
408 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[409 rows x 6 columns]
print(df.drop_duplicates())
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
2 juejin NaN 0 -2.0 1 2019-11-23 23:00:03
3 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
4 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
5 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
404 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
405 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
406 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
407 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
408 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[408 rows x 6 columns]複製代碼
能夠看到第一個示例中共有 409 行數據,到了第二個結果,就只剩 408 行數據了。
這個示例是針對總體值進行判斷的,咱們一樣能夠只針對某一列進行去重,只須要在 drop_duplicates()
這個方法中指明要判斷的列便可:
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.drop_duplicates(subset='read_num'))
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
0 cnblog 215.0 0 118.0 0 2019-11-23 23:00:10
2 juejin NaN 0 -2.0 1 2019-11-23 23:00:03
3 csdn 1652.0 69 0.0 24 2019-11-23 23:00:02
4 cnblog 650.0 3 NaN 0 2019-11-22 23:00:15
5 juejin 272.0 3 -23.0 1 2019-11-22 23:00:02
.. ... ... ... ... ... ...
403 cnblog 140.0 0 37.0 0 2020-02-20 23:00:08
404 juejin 212.0 0 -1.0 2 2020-02-20 23:00:02
405 csdn 1602.0 1 0.0 1 2020-02-20 23:00:01
406 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
408 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02
[342 rows x 6 columns]複製代碼
能夠看到這裏只剩下了 342 行記錄,固然對不對小編沒有區驗證,這個能夠經過 sql 直接在數據庫中作查詢驗證或者在 Excel 中使用去重進行驗證(小編相信官方的 API 不會騙人)。
除了這些,還能夠自定義刪除重複項時保留哪一個,默認是保留第一個,也能夠設置保留最後一個,還能夠設置一個都不保留:
import pandas as pd
# 相對路徑
df = pd.read_excel("result_data.xlsx")
print(df.drop_duplicates(subset='plantform', keep='last'))
# 輸出結果
plantform read_num fans_num rank_num like_num create_date
406 cnblog 19.0 0 41.0 0 2020-02-21 23:00:05
407 juejin 125.0 1 -4.0 0 2020-02-21 23:00:02
408 csdn 1475.0 8 0.0 3 2020-02-21 23:00:02複製代碼
小編這裏選擇經過 plantform
字段進行去重篩選,從行號上看應該對的,保留了最後三條數據。
keep
的值默認是 first
,也就是隻保留第一個,除了 first
, last
還有一個是 False ,它的含義是一個都不保留。
本篇的內容就到這裏結束了,但願各位同窗能多動動手,多敲敲代碼,雖然這是學代碼最笨的辦法,但同時也是最有效的方法。
老規矩,全部的示例代碼都會上傳至代碼管理倉庫 Github 和 Gitee 上,方便你們取用。