python pandas dataframe多列篩選方式
python pandas dataframe多列篩選
# 括號不能少 data[(data['age']>20) & (data['height']>176)]
Python dataframe 多條件篩選/過濾數(shù)據(jù)的方法及函數(shù)isin,query,contains,loc使用
1. 背景概述
日常的數(shù)據(jù)分析中,經(jīng)常要根據(jù)各種不同的條件從數(shù)據(jù)集中篩選出相應的數(shù)據(jù)記錄,再進行提取、替換、修改和分析等操作。
因此篩選是數(shù)據(jù)分析中使用頻率最高的操作之一。在剛開始做數(shù)據(jù)分析的時候,常常是使用for循環(huán)在數(shù)據(jù)集中進行條件篩選,導致代碼比較冗長且效率不高。
總結(jié)了在python中常用的并且使用效率比較高的幾種數(shù)據(jù)篩選函數(shù)如:isin()、query()、contains()、loc()等,并且展示了它們單獨使用或搭配一起使用的實踐效果。
2. 篩選方法和函數(shù)簡介
2.1 簡單的篩選方法:單一的篩選:條件范圍可以是數(shù)值或字符串df[df[“column_name”] == value]多字段的篩選(又稱為復合條件的篩選): 多個不同的特征列,并且條件可以對應不同的數(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ù)記錄, 用法有點類似sql中的"in"
2.3 query函數(shù):df.query("(column_name1 == ‘str1’) & (column_name2 == ‘str2’)")根據(jù)query中引入的不同字段(str1,str2等)和條件,篩選出同時能滿足這些要求的數(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ù)特征屬性(列名)或索引標簽篩選數(shù)據(jù):df.loc[columns 篩選條件] 或df.loc[index 篩選條件];同時根據(jù)索引標簽和特征屬性(列名)篩選數(shù)據(jù):df.loc[index 篩選條件,columns 篩選條件]
2.6 篩選函數(shù)之間還能根據(jù)各自的特點搭配使用
3. 函數(shù)的使用實踐
3.1 數(shù)據(jù)準備和說明
數(shù)據(jù)準備:數(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]的運行結(jié)果是一樣的。
# 2 多重條件篩選 -- 篩選的條件是數(shù)值 # 篩選并提取protein 在40-50之間的記錄(符合條件) data = df[(df["protein"] >= 40) & (df["protein"] <= 50)] data
# 3 多重條件篩選 -- 篩選的條件有數(shù)值和字符串 # 篩選出蛋白質(zhì)含量大于30并且產(chǎn)品評級為"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ù)記錄, 用法有點類似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ù)據(jù)記錄
# 篩選出名稱為“A001”或“B001”,并且級別都是“1st”的數(shù)據(jù)記錄 data = df.query("(name=='A001'| name=='B001') & (rank == '1st')") data
溫馨提示:在使用query函數(shù)時,所有的表達內(nèi)容都必須用引號標識出來,并且字符串的引號與表達式的引號需要區(qū)分出來(即遵從使用雙引號與單引號的套用規(guī)則)。
另外,特征列名稱是不需要使用引號標注的,這可以理解為是直接調(diào)用了列表,因此列名稱不需要注釋。
3.2.4 contains 函數(shù)的使用
# 1 篩選出所有名稱中還有“K”的數(shù)據(jù)記錄 data = df[df["name"].str.contains("K")] data
# 2 篩選出級別中含有"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ù)標簽和特征列名進行數(shù)據(jù)篩選 # 5.1 單一條件的篩選 data = df.loc[df["protein"] <=30] # 與df[df["protein"] <=30]的運行結(jié)果是一致的! data
小結(jié):這與之前說的 df[df[“protein”] <=30] 的運行結(jié)果是一致的!
# 5.2 復合條件的篩選 # 篩選出名稱為"B001"并且蛋白質(zhì)含量低于30的數(shù)據(jù)記錄 data = df.loc[(df["name"]=="B001") & (df["protein"]<=30)] data
# 5.3 使用loc函數(shù)同時對索引標簽和特征屬性(列名)進行數(shù)據(jù)篩選 # 注意:當使用loc函數(shù)根據(jù)索引標簽和特征列名進行篩選時,需要設定相應的索引標簽。本測試會先將名稱更換為索引值再進行篩選(使用set_index()函數(shù)將特征列名轉(zhuǎn)換為索引值) # 篩選出名稱為"B001"的所有數(shù)據(jù)記錄 test = df.copy().set_index("name") test.loc["B001", :]
# 5.4 篩選出名稱為"B001"和“A001”的蛋白質(zhì)和評級數(shù)據(jù) test_ = test.loc[["B001", "A001"], ["protein", "rank"]] test_
3.2.6 篩選函數(shù)的搭配使用
上述介紹的篩選方法和函數(shù)是可以被搭配在一起使用,并且效果很不錯!
# 1 篩選出蛋白質(zhì)小于等于30,并且級別是含有"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ù)的使用很靈活,能將多個不用的數(shù)值范圍要求或字段要求通過列表的形式傳入函數(shù)中進行篩選。
- query 函數(shù)能進行多字段的篩選,但要特別注意列名的引用,以及格式的書寫與其他函數(shù)不一樣的地方。
- contains 函數(shù)其實是相當與SQL 中的contains的用法,能靈活地對字符串的數(shù)據(jù)進行篩選。
- 篩選方法和函數(shù)是可以根據(jù)不同的需要被搭配在一起形成多重的條件篩選,并且使用的效果很不錯!
- 如果是同時對行和列進行篩選,可使用df.loc[index 篩選條件,columns 篩選條件]
基礎概念:loc函數(shù)與iloc函數(shù)的區(qū)別
1.loc() 函數(shù):指Selection by label的函數(shù)
- 是按照標簽來提取數(shù)據(jù),標簽是由2個參數(shù)決定的。
- 第1個參數(shù)是index: “0”-“6”; 第2個參數(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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python模型聚合查詢\Q查詢\F查詢\分組查詢操作技巧解析
這篇文章主要介紹了模型查詢中的一些操作技巧,主要包括模型聚合查詢,Q查詢,F(xiàn)查詢,分組查詢,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09python根據(jù)時間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03