python pandas dataframe多列篩選方式
python pandas dataframe多列篩選
# 括號(hào)不能少 data[(data['age']>20) & (data['height']>176)]
Python dataframe 多條件篩選/過濾數(shù)據(jù)的方法及函數(shù)isin,query,contains,loc使用
1. 背景概述
日常的數(shù)據(jù)分析中,經(jīng)常要根據(jù)各種不同的條件從數(shù)據(jù)集中篩選出相應(yīng)的數(shù)據(jù)記錄,再進(jìn)行提取、替換、修改和分析等操作。
因此篩選是數(shù)據(jù)分析中使用頻率最高的操作之一。在剛開始做數(shù)據(jù)分析的時(shí)候,常常是使用for循環(huán)在數(shù)據(jù)集中進(jìn)行條件篩選,導(dǎo)致代碼比較冗長且效率不高。
總結(jié)了在python中常用的并且使用效率比較高的幾種數(shù)據(jù)篩選函數(shù)如:isin()、query()、contains()、loc()等,并且展示了它們單獨(dú)使用或搭配一起使用的實(shí)踐效果。
2. 篩選方法和函數(shù)簡介
2.1 簡單的篩選方法:單一的篩選:條件范圍可以是數(shù)值或字符串df[df[“column_name”] == value]多字段的篩選(又稱為復(fù)合條件的篩選): 多個(gè)不同的特征列,并且條件可以對應(yīng)不同的數(shù)值或字符串df[(df[“column_name1”] <= value) & (df[“column_name2”] == str)]
2.2 isin函數(shù):df[df[“column_name”].isin(li)] (# li = [20, 25, 27] 或 li = np.arange(20, 30))根據(jù)從isin函數(shù)傳入的列表(li),篩選出與列表中包含的數(shù)值或字符串相同的數(shù)據(jù)記錄, 用法有點(diǎn)類似sql中的"in"
2.3 query函數(shù):df.query("(column_name1 == ‘str1’) & (column_name2 == ‘str2’)")根據(jù)query中引入的不同字段(str1,str2等)和條件,篩選出同時(shí)能滿足這些要求的數(shù)據(jù)記錄
2.4 contains函數(shù):df[df[“column_name”].str.contains(“str”)]篩選出所有含有(str)的數(shù)據(jù)記錄, 用法類似于sql中的"contains"
2.5 loc函數(shù):df.loc[df["column_name] <= value]根據(jù)特征屬性(列名)或索引標(biāo)簽篩選數(shù)據(jù):df.loc[columns 篩選條件] 或df.loc[index 篩選條件];同時(shí)根據(jù)索引標(biāo)簽和特征屬性(列名)篩選數(shù)據(jù):df.loc[index 篩選條件,columns 篩選條件]
2.6 篩選函數(shù)之間還能根據(jù)各自的特點(diǎn)搭配使用
3. 函數(shù)的使用實(shí)踐
3.1 數(shù)據(jù)準(zhǔn)備和說明
數(shù)據(jù)準(zhǔn)備:數(shù)據(jù)按行篩選(數(shù)據(jù)記錄)并提取數(shù)據(jù)
import numpy as np import pandas as pd df = pd.DataFrame({"name": ["A001", "A002", "B001", "A001_K", "C002", "B001_K", "B001"], "protein": [25, 28, 45, 22, 60, 40, 27], "Qty": [85, 90, 75, 80, 30, 50, 30], "rank": ["1st", "1st", "1st", "2nd", "1st", "1st", "2nd"]}) df
3.2 示例代碼
3.2.1 簡單的條件篩選方法
# 1 簡單的條件篩選:單一條件篩選 data = df[df["protein"] <= 30] data
代碼描述:df.loc[df[“protein”] <= 30] 與 df[df[“protein”] <= 30]的運(yùn)行結(jié)果是一樣的。
# 2 多重條件篩選 -- 篩選的條件是數(shù)值 # 篩選并提取protein 在40-50之間的記錄(符合條件) data = df[(df["protein"] >= 40) & (df["protein"] <= 50)] data
# 3 多重條件篩選 -- 篩選的條件有數(shù)值和字符串 # 篩選出蛋白質(zhì)含量大于30并且產(chǎn)品評級(jí)為"1st"的數(shù)據(jù) data = df[(df["protein"] >= 30) & (df["rank"] == "1st")] data
3.2.2 isin 函數(shù)的使用
返回的結(jié)果是根據(jù)從isin函數(shù)傳入的列表(li),篩選出與列表中包含的數(shù)值或字符串相同的數(shù)據(jù)記錄, 用法有點(diǎn)類似sql中的"in"
# 篩選出與列表中的數(shù)值或字符串相等的數(shù)據(jù)記錄 # li = np.arange(20, 30) li = [25, 60, 45, 40] data = df[df["protein"].isin(li)] data
3.2.3 query 函數(shù)的使用
返回的結(jié)果是根據(jù)query中引入的不同字段(str1,str2)和條件,篩選出同時(shí)能滿足這些要求的數(shù)據(jù)記錄
# 篩選出名稱為“A001”或“B001”,并且級(jí)別都是“1st”的數(shù)據(jù)記錄 data = df.query("(name=='A001'| name=='B001') & (rank == '1st')") data
溫馨提示:在使用query函數(shù)時(shí),所有的表達(dá)內(nèi)容都必須用引號(hào)標(biāo)識(shí)出來,并且字符串的引號(hào)與表達(dá)式的引號(hào)需要區(qū)分出來(即遵從使用雙引號(hào)與單引號(hào)的套用規(guī)則)。
另外,特征列名稱是不需要使用引號(hào)標(biāo)注的,這可以理解為是直接調(diào)用了列表,因此列名稱不需要注釋。
3.2.4 contains 函數(shù)的使用
# 1 篩選出所有名稱中還有“K”的數(shù)據(jù)記錄 data = df[df["name"].str.contains("K")] data
# 2 篩選出級(jí)別中含有"st", 并且名字中含有"K"的數(shù)據(jù)記錄 data = df[(df["rank"].str.contains("st") & df["name"].str.contains("K"))] data
3.2.5 loc 函數(shù)的使用
# 5. loc() 函數(shù) -- 根據(jù)標(biāo)簽和特征列名進(jìn)行數(shù)據(jù)篩選 # 5.1 單一條件的篩選 data = df.loc[df["protein"] <=30] # 與df[df["protein"] <=30]的運(yùn)行結(jié)果是一致的! data
小結(jié):這與之前說的 df[df[“protein”] <=30] 的運(yùn)行結(jié)果是一致的!
# 5.2 復(fù)合條件的篩選 # 篩選出名稱為"B001"并且蛋白質(zhì)含量低于30的數(shù)據(jù)記錄 data = df.loc[(df["name"]=="B001") & (df["protein"]<=30)] data
# 5.3 使用loc函數(shù)同時(shí)對索引標(biāo)簽和特征屬性(列名)進(jìn)行數(shù)據(jù)篩選 # 注意:當(dāng)使用loc函數(shù)根據(jù)索引標(biāo)簽和特征列名進(jìn)行篩選時(shí),需要設(shè)定相應(yīng)的索引標(biāo)簽。本測試會(huì)先將名稱更換為索引值再進(jìn)行篩選(使用set_index()函數(shù)將特征列名轉(zhuǎn)換為索引值) # 篩選出名稱為"B001"的所有數(shù)據(jù)記錄 test = df.copy().set_index("name") test.loc["B001", :]
# 5.4 篩選出名稱為"B001"和“A001”的蛋白質(zhì)和評級(jí)數(shù)據(jù) test_ = test.loc[["B001", "A001"], ["protein", "rank"]] test_
3.2.6 篩選函數(shù)的搭配使用
上述介紹的篩選方法和函數(shù)是可以被搭配在一起使用,并且效果很不錯(cuò)!
# 1 篩選出蛋白質(zhì)小于等于30,并且級(jí)別是含有"2nd"的數(shù)據(jù)記錄 data = df[(df["protein"] <=30) & df["rank"].str.contains("2nd")] data
# 2 篩選出蛋白質(zhì)的含量是列表中的數(shù)值,并且名稱中含有"K"的數(shù)據(jù)記錄 li = [25, 60, 45, 40, 22] data = df[(df["protein"].isin(li)) & (df["name"].str.contains("K"))] data
4. 結(jié)束語
- 單一條件的行或列的篩選可直接使用df[columns 篩選條件] 或df[indx 篩選條件]
- isin 函數(shù)的使用很靈活,能將多個(gè)不用的數(shù)值范圍要求或字段要求通過列表的形式傳入函數(shù)中進(jìn)行篩選。
- query 函數(shù)能進(jìn)行多字段的篩選,但要特別注意列名的引用,以及格式的書寫與其他函數(shù)不一樣的地方。
- contains 函數(shù)其實(shí)是相當(dāng)與SQL 中的contains的用法,能靈活地對字符串的數(shù)據(jù)進(jìn)行篩選。
- 篩選方法和函數(shù)是可以根據(jù)不同的需要被搭配在一起形成多重的條件篩選,并且使用的效果很不錯(cuò)!
- 如果是同時(shí)對行和列進(jìn)行篩選,可使用df.loc[index 篩選條件,columns 篩選條件]
基礎(chǔ)概念:loc函數(shù)與iloc函數(shù)的區(qū)別
1.loc() 函數(shù):指Selection by label的函數(shù)
- 是按照標(biāo)簽來提取數(shù)據(jù),標(biāo)簽是由2個(gè)參數(shù)決定的。
- 第1個(gè)參數(shù)是index: “0”-“6”; 第2個(gè)參數(shù)是column: “name”, “protein”, “Qty”, “rank” # df.loc[6, :], # df.loc[6, “protein”]
2.iloc(n, m) 函數(shù):指Selection by Position的函數(shù)
- 是按位置選擇數(shù)據(jù),即第n行,第m列,只接受整數(shù)型 的參數(shù) # df.iloc[:, 0]; #df.iloc[1, :]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python模型聚合查詢\Q查詢\F查詢\分組查詢操作技巧解析
這篇文章主要介紹了模型查詢中的一些操作技巧,主要包括模型聚合查詢,Q查詢,F(xiàn)查詢,分組查詢,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09盤點(diǎn)Python中讀取和提取JSON文件的4種方法
JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,Python中提供了多種方式來讀取和處理JSON文件,本文將詳細(xì)介紹四種常見的方法,希望對大家有所幫助2024-03-03Python編程根據(jù)字典列表相同鍵的值進(jìn)行合并
這篇文章主要介紹了來學(xué)習(xí)Python字典列表根據(jù)相同鍵的值進(jìn)行合并的操作方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10圖文詳解梯度下降算法的原理及Python實(shí)現(xiàn)
梯度下降是迭代法的一種,可以用于求解最小二乘問題(線性和非線性都可以)。本文將通過圖文詳解梯度下降算法的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08python根據(jù)時(shí)間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時(shí)間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Python爬蟲學(xué)習(xí)之requests的使用教程
requests庫是一個(gè)常用的用于?http?請求的模塊,它使用?python?語言編寫,可以方便的對網(wǎng)頁進(jìn)行爬取。本文將通過示例詳細(xì)講講requests庫的使用,需要的可以參考一下2022-08-08