1. 程式人生 > >[Python] Pandas 對資料進行查詢、替換、篩選、排序、重複值和缺失值處理

[Python] Pandas 對資料進行查詢、替換、篩選、排序、重複值和缺失值處理

[TOC] 查詢和替換是日常工作中很常見的資料預處理操作,下面就來講解如何使用pandas模組中的函式對DataFrame中的資料進行查詢和替換。 ## 1. 資料檔案 [產品統計表.7z](https://files.cnblogs.com/files/feily/%E4%BA%A7%E5%93%81%E7%BB%9F%E8%AE%A1%E8%A1%A8.7z) ## 2. 讀資料 ```python import pandas as pd data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv') print(data) ``` 輸出 ``` 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 a001 揹包 16 65 60 960 3900 2940 1 a002 錢包 90 187 50 4500 9350 4850 2 a003 揹包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 錢包 90 187 78 7020 14586 7566 5 a006 單肩包 58 124 63 3654 7812 4158 6 a007 單肩包 58 124 58 3364 7192 3828 ``` ## 3. 查詢資料 ```python >>> data.isin(['錢包','005']) 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 False False False False False False False False 1 False True False False False False False False 2 False False False False False False False False 3 False False False False False False False False 4 False True False False False False False False 5 False False False False False False False False 6 False False False False False False False False >>> data['產品'].isin(['手提包']) 0 False 1 False 2 False 3 True 4 False 5 False 6 False Name: 產品, dtype: bool ``` 說明: 1. 在整個資料表中查詢是否有值“a005”和“錢包”,將等於“a005”或“錢包”的地方標記為True,將不等於“a005”或“錢包”的地方標記為False。需要注意的是,要查詢的值必須以列表的形式給出。 2. 判斷資料表的某一列中是否有某個值。在“產品”列中查詢值“手提包”,將等於“手提包”的地方標記為True,將不等於“手提包”的地方標記為False。 ## 4. 替換資料 ### 4.1 一對一替換 將資料表中的值“揹包”全部替換為“挎包”。replace()函式括號中逗號前面的引數是需要替換的值,逗號後面的引數是替換後的值。 引數inplace預設是不對原表替換,設定為True則原表上替換。 ```python >>> data.replace('揹包','挎包', inplace=True) >>> print(data) 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 a001 挎包 16 65 60 960 3900 2940 1 a002 錢包 90 187 50 4500 9350 4850 2 a003 挎包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 錢包 90 187 78 7020 14586 7566 5 a006 單肩包 58 124 63 3654 7812 4158 6 a007 單肩包 58 124 58 3364 7192 3828 ``` ### 4.2 多對一替換 ```python >>> data.replace(['揹包','手提包'], '挎包') 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 a001 挎包 16 65 60 960 3900 2940 1 a002 錢包 90 187 50 4500 9350 4850 2 a003 挎包 16 65 23 368 1495 1127 3 a004 挎包 36 147 26 936 3822 2886 4 a005 錢包 90 187 78 7020 14586 7566 5 a006 單肩包 58 124 63 3654 7812 4158 6 a007 單肩包 58 124 58 3364 7192 3828 ``` ### 4.3 多對多替換 多對多替換可以看成是多個一對一替換。 ```python >>> data.replace({'揹包':'挎包', 16:39, 65:68}, inplace=True) >>> print(data) 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 a001 挎包 39 68 60 960 3900 2940 1 a002 錢包 90 187 50 4500 9350 4850 2 a003 挎包 39 68 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 錢包 90 187 78 7020 14586 7566 5 a006 單肩包 58 124 63 3654 7812 4158 6 a007 單肩包 58 124 58 3364 7192 3828 ``` ## 5. 插入資料 pandas模組沒有專門提供插入行的方法,因此,插入資料主要是指插入一列新的資料。常用的方法有兩種: + 第一種是以賦值的方式在資料表的最右側插入列資料; + 第二種是用insert()函式在資料表的指定位置插入列資料。 ```python >>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv') >>> data['品牌'] = ['AM','DE','SR','AM','TY','DE','UD'] >>> print(data) 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 品牌 0 a001 揹包 16 65 60 960 3900 2940 AM 1 a002 錢包 90 187 50 4500 9350 4850 DE 2 a003 揹包 16 65 23 368 1495 1127 SR 3 a004 手提包 36 147 26 936 3822 2886 AM 4 a005 錢包 90 187 78 7020 14586 7566 TY 5 a006 單肩包 58 124 63 3654 7812 4158 DE 6 a007 單肩包 58 124 58 3364 7192 3828 UD >>> data.insert(2, '產地', ['北京','深圳','成都','杭州','上海','重慶','武漢']) >>> print(data) 編號 產品 產地 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 品牌 0 a001 揹包 北京 16 65 60 960 3900 2940 AM 1 a002 錢包 深圳 90 187 50 4500 9350 4850 DE 2 a003 揹包 成都 16 65 23 368 1495 1127 SR 3 a004 手提包 杭州 36 147 26 936 3822 2886 AM 4 a005 錢包 上海 90 187 78 7020 14586 7566 TY 5 a006 單肩包 重慶 58 124 63 3654 7812 4158 DE 6 a007 單肩包 武漢 58 124 58 3364 7192 3828 UD ``` ## 6. 刪除資料 使用pandas模組中的drop()函式。該函式既可以刪除指定的列,也可以刪除指定的行。 ### 6.1 刪除列 在drop()函式中直接給出要刪除的列的列標籤就可以刪除列。 ```python >>> data.drop(['成本價(元/個)', '成本(元)'], axis=1) 編號 產品 產地 銷售價(元/個) 數量(個) 收入(元) 利潤(元) 品牌 0 a001 揹包 北京 65 60 3900 2940 AM 1 a002 錢包 深圳 187 50 9350 4850 DE 2 a003 揹包 成都 65 23 1495 1127 SR 3 a004 手提包 杭州 147 26 3822 2886 AM 4 a005 錢包 上海 187 78 14586 7566 TY 5 a006 單肩包 重慶 124 63 7812 4158 DE 6 a007 單肩包 武漢 124 58 7192 3828 UD ``` drop()函式設定了兩個引數: + 第1個引數以列表的形式給出要刪除的行或列的標籤; + 第2個引數axis用於設定按行刪除還是按列刪除; + 設定為0表示按行刪除(即第1個引數中給出的標籤是行標籤); + 設定為1表示按列刪除(即第1個引數中給出的標籤是列標籤)。 + 還可以通過列序號來獲取列標籤,然後作為drop()函式的第1個引數使用。 ``` # 這3個效果一樣 data.drop(data.columns[[3,6]], axis=1) data.drop(['成本價(元/個)', '成本(元)'], axis=1) data.drop(columns=['成本價(元/個)', '成本(元)'], axis=1) ``` ### 6.2 刪除行 刪除行的方法和刪除列的方法類似,都要用到drop()函式,只不過需要將引數axis設定為0,其預設值是0,可以不設。 ```python >>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv', index_col=0) >>> data.drop(['a001','a003'], axis=0) 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 編號 a002 錢包 90 187 50 4500 9350 4850 a004 手提包 36 147 26 936 3822 2886 a005 錢包 90 187 78 7020 14586 7566 a006 單肩包 58 124 63 3654 7812 4158 a007 單肩包 58 124 58 3364 7192 3828 ``` 和刪除列類似. ```python # 這3個效果一樣,只不過在使用第2種時,讀檔案時,可以不用index-col引數 data.drop(['a001','a003'], axis=0) data.drop(data.index[[0,2]]) data.drop(index=['a001','a003']) ``` ## 7. 處理缺失值 ### 7.1 資料準備 [產品統計表1.7z](https://files.cnblogs.com/files/feily/%E4%BA%A7%E5%93%81%E7%BB%9F%E8%AE%A1%E8%A1%A81.7z) ### 7.2 檢視缺失值 在Python中,缺失值一般用NaN表示。從執行結果可以看出,資料表的第3行和第7行含有缺失值。 ```python >>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表1.csv') >>> print(data) 編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元) 0 a001 揹包 16.0 65 60 960.0 3900 2940 1 a002 錢包 90.0 187 50 4500.0 9350 4850 2 a003 揹包 NaN 65 23 368.0 1495 1127 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 錢包 90.0 187 78 7020.0 14586 7566 5 a006 單肩包 58.0 124 63 3654.0 7812 4158 6 a007 單肩包 58.0 124 58 NaN 7192 3828 ``` 如果要檢視每一列的缺失值情況,可以使用pandas模組中的info()函式。 ```python >>> print(data.