0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

pandas篩選數(shù)據(jù)的8個(gè)小技巧

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:Python數(shù)據(jù)科學(xué) ? 作者:東哥起飛 ? 2021-09-26 11:04 ? 次閱讀

日常用Python做數(shù)據(jù)分析最常用到的就是查詢(xún)篩選了,按各種條件、各種維度以及組合挑出我們想要的數(shù)據(jù),以方便我們分析挖掘。東哥總結(jié)了日常查詢(xún)和篩選常用的種騷操作,供各位學(xué)習(xí)參考。本文采用sklearnboston數(shù)據(jù)舉例介紹。

fromsklearnimportdatasets
importpandasaspd

boston=datasets.load_boston()
df=pd.DataFrame(boston.data,columns=boston.feature_names)

9f72463a-1114-11ec-8fb8-12bb97331649.png

1. []

第一種是最快捷方便的,直接在dataframe的[]中寫(xiě)篩選的條件或者組合條件。比如下面,想要篩選出大于NOX這變量平均值的所有數(shù)據(jù),然后按NOX降序排序。

df[df['NOX']>df['NOX'].mean()].sort_values(by='NOX',ascending=False).head()

9f8862e4-1114-11ec-8fb8-12bb97331649.png

當(dāng)然,也可以使用組合條件,條件之間使用邏輯符號(hào)& |等。比如下面這個(gè)例子除了上面條件外再加上且條件CHAS為1,注意邏輯符號(hào)分開(kāi)的條件要用()隔開(kāi)。

df[(df['NOX']>df['NOX'].mean())&(df['CHAS']==1)].sort_values(by='NOX',ascending=False).head()

9f96c9ba-1114-11ec-8fb8-12bb97331649.png

2. loc/iloc

[]之外,loc/iloc應(yīng)該是最常用的兩種查詢(xún)方法了。loc標(biāo)簽值(列名和行索引取值)訪(fǎng)問(wèn),iloc按數(shù)字索引訪(fǎng)問(wèn),均支持單值訪(fǎng)問(wèn)或切片查詢(xún)。除了可以像[]按條件篩選數(shù)據(jù)以外,loc還可以指定返回的列變量,**從行和列兩個(gè)維度篩選。**比如下面這個(gè)例子,按條件篩選出數(shù)據(jù),并篩選出指定變量,然后賦值。

df.loc[(df['NOX']>df['NOX'].mean()),['CHAS']]=2

9fae84a6-1114-11ec-8fb8-12bb97331649.png

3. isin

上面我們篩選條件< > == !=都是個(gè)范圍,但很多時(shí)候是需要鎖定某些具體的值的,這時(shí)候就需要isin了。比如我們要限定NOX取值只能為0.538,0.713,0.437中時(shí)。

df.loc[df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

9fbd671e-1114-11ec-8fb8-12bb97331649.png

當(dāng)然,也可以做取反操作,在篩選條件前加~符號(hào)即可。

df.loc[~df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

9fcf1112-1114-11ec-8fb8-12bb97331649.png

4. str.contains

上面的舉例都是數(shù)值大小比較的篩選條件,除數(shù)值以外當(dāng)然也有字符串的查詢(xún)需求pandas里實(shí)現(xiàn)字符串的模糊篩選,可以用.str.contains()來(lái)實(shí)現(xiàn),有點(diǎn)像在SQL語(yǔ)句里用的是like。下面利用titanic的數(shù)據(jù)舉例,篩選出人名中包含Mrs或者Lily的數(shù)據(jù),|或邏輯符號(hào)在引號(hào)內(nèi)。

train.loc[train['Name'].str.contains('Mrs|Lily'),:].head()

9fe358de-1114-11ec-8fb8-12bb97331649.png

.str.contains()中還可以設(shè)置正則化篩選邏輯。

  • case=True:使用case指定區(qū)分大小寫(xiě)
  • na=True:就表示把有NAN的轉(zhuǎn)換為布爾值True
  • flags=re.IGNORECASE:標(biāo)志傳遞到re模塊,例如re.IGNORECASE
  • regex=True:regex :如果為T(mén)rue,則假定第一個(gè)字符串是正則表達(dá)式,否則還是字符串

5. where/mask

在SQL里,我們知道where的功能是要把滿(mǎn)足條件的篩選出來(lái)。pandas中where也是篩選,但用法稍有不同。where接受的條件需要是布爾類(lèi)型的,如果不滿(mǎn)足匹配條件,就被賦值為默認(rèn)的NaN或其他指定值。舉例如下,將Sexmale當(dāng)作篩選條件,cond就是一列布爾型的Series,非male的值就都被賦值為默認(rèn)的NaN空值了。

cond=train['Sex']=='male'
train['Sex'].where(cond,inplace=True)
train.head()

9ff0217c-1114-11ec-8fb8-12bb97331649.png

也可以用other賦給指定值。

cond=train['Sex']=='male'
train['Sex'].where(cond,other='FEMALE',inplace=True)

9ffc2c10-1114-11ec-8fb8-12bb97331649.png

甚至還可以寫(xiě)組合條件。

train['quality']=''
traincond1=train['Sex']=='male'
cond2=train['Age']>25

train['quality'].where(cond1&cond2,other='低質(zhì)量男性',inplace=True)

a00930cc-1114-11ec-8fb8-12bb97331649.png

maskwhere是一對(duì)操作,與where正好反過(guò)來(lái)。

train['quality'].mask(cond1&cond2,other='低質(zhì)量男性',inplace=True)

a0174b8a-1114-11ec-8fb8-12bb97331649.png

6. query

這是一種非常優(yōu)雅的篩選數(shù)據(jù)方式。所有的篩選操作都在''之內(nèi)完成。

#常用方式
train[train.Age>25]
#query方式
train.query('Age>25')

上面的兩種方式效果上是一樣的。再比如復(fù)雜點(diǎn)的,加入上面的str.contains用法的組合條件,注意條件里有''時(shí),兩邊要用""包住。

train.query("Name.str.contains('William')&Age>25")

a02756e2-1114-11ec-8fb8-12bb97331649.png

query里還可以通過(guò)@來(lái)設(shè)定變量。

name='William'
train.query("Name.str.contains(@name)")

7. filter

filter是另外一個(gè)獨(dú)特的篩選功能。filter不篩選具體數(shù)據(jù),而是篩選特定的行或列。它支持三種篩選方式:

  • items:固定列名
  • regex:正則表達(dá)式
  • like:以及模糊查詢(xún)
  • axis:控制是行index或列columns的查詢(xún)

下面舉例介紹下。

train.filter(items=['Age','Sex'])

train.filter(regex='S',axis=1)#列名包含S的

train.filter(like='2',axis=0)#索引中有2的

a052a612-1114-11ec-8fb8-12bb97331649.png

train.filter(regex='^2',axis=0).filter(like='S',axis=1)

8. any/all

any方法意思是,如果至少有一個(gè)值為True結(jié)果便為True,all需要所有值為True結(jié)果才為True,比如下面這樣。

>>train['Cabin'].all()
>>False
>>train['Cabin'].any()
>>True

anyall一般是需要和其它操作配合使用的,比如查看每列的空值情況。

train.isnull().any(axis=0)

a088f6b8-1114-11ec-8fb8-12bb97331649.png

再比如查看含有空值的行數(shù)。

>>>train.isnull().any(axis=1).sum()
>>>708
編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88311
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84078

原文標(biāo)題:pandas 篩選數(shù)據(jù)的 8 個(gè)騷操作

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么stm32F407ZET6 CAN1的14-28篩選器不起作用?

    CAN共有28個(gè)篩選器組,每個(gè)篩選器可配置4種模式,分別是1個(gè)32位掩碼,2個(gè)32位標(biāo)識(shí)符,2個(gè)
    發(fā)表于 03-21 07:18

    mapgis屬性篩選表達(dá)式

    MapGIS是一種廣泛應(yīng)用于地理信息系統(tǒng)(GIS)領(lǐng)域的軟件平臺(tái)。它提供了多種功能和工具,用于處理和分析地理數(shù)據(jù)。屬性篩選是MapGIS中一項(xiàng)重要的功能,它允許用戶(hù)根據(jù)特定的屬性條件來(lái)篩選要素。在這
    的頭像 發(fā)表于 02-25 10:58 ?1147次閱讀

    Python利用pandas讀寫(xiě)Excel文件

    使用pandas模塊讀取Excel文件可以更為方便和快捷。pandas可以將Excel文件讀取為一個(gè)DataFrame對(duì)象,方便進(jìn)行數(shù)據(jù)處理和分析。
    的頭像 發(fā)表于 12-16 11:22 ?1030次閱讀
    Python利用<b class='flag-5'>pandas</b>讀寫(xiě)Excel文件

    使用pandas進(jìn)行數(shù)據(jù)選擇和過(guò)濾的基本技術(shù)和函數(shù)

    Python pandas庫(kù)提供了幾種選擇和過(guò)濾數(shù)據(jù)的方法,如loc、iloc、[]括號(hào)操作符、query、isin、between等等
    的頭像 發(fā)表于 12-01 10:14 ?280次閱讀
    使用<b class='flag-5'>pandas</b>進(jìn)行<b class='flag-5'>數(shù)據(jù)</b>選擇和過(guò)濾的基本技術(shù)和函數(shù)

    如何實(shí)現(xiàn)Pandas的DataFrame轉(zhuǎn)換交互式表格

    Pivottablejs是一個(gè)通過(guò)IPython widgets集成到Python中的JavaScript庫(kù),允許用戶(hù)直接從DataFrame數(shù)據(jù)創(chuàng)建交互式和靈活的匯總報(bào)表??梢赃M(jìn)行高效、清晰的數(shù)據(jù)分析和表示,幫助將
    的頭像 發(fā)表于 11-21 16:15 ?678次閱讀
    如何實(shí)現(xiàn)<b class='flag-5'>Pandas</b>的DataFrame轉(zhuǎn)換交互式表格

    Pandas:Python中強(qiáng)大方便的繪圖功能

    編譯到C,并且在C上執(zhí)行,因此也保證了處理速度。不過(guò)我們今天的重點(diǎn)不在于它的處理速度,而是它和matplotlib合作產(chǎn)生的強(qiáng)大且方便的繪圖功能。 到底有多強(qiáng)呢?讓我們來(lái)體會(huì)一下。 1.創(chuàng)建數(shù)據(jù) 使用pandas可以很方便地進(jìn)行數(shù)據(jù)
    的頭像 發(fā)表于 11-03 11:04 ?420次閱讀
    <b class='flag-5'>Pandas</b>:Python中強(qiáng)大方便的繪圖功能

    如何用pandas實(shí)現(xiàn)execl中的匯總行

    最近小伙伴提出了幾個(gè)問(wèn)題,如何用pandas實(shí)現(xiàn)execl中的匯總行。 關(guān)于這個(gè)問(wèn)題,群里展開(kāi)了激烈的討論,最終經(jīng)過(guò)梳理總結(jié)出了以下兩個(gè)解決方法。一種是當(dāng)做透視時(shí)直接使用參數(shù) margins
    的頭像 發(fā)表于 11-03 10:34 ?370次閱讀
    如何用<b class='flag-5'>pandas</b>實(shí)現(xiàn)execl中的匯總行

    Pandas DataFrame的存儲(chǔ)格式性能對(duì)比

    Pandas 支持多種存儲(chǔ)格式,在本文中將對(duì)不同類(lèi)型存儲(chǔ)格式下的Pandas Dataframe的讀取速度、寫(xiě)入速度和大小的進(jìn)行測(cè)試對(duì)比。 創(chuàng)建測(cè)試Dataframe 首先創(chuàng)建一個(gè)包含不同類(lèi)型
    的頭像 發(fā)表于 11-03 09:58 ?432次閱讀
    <b class='flag-5'>Pandas</b> DataFrame的存儲(chǔ)格式性能對(duì)比

    Tablib:一個(gè)Python的第三方數(shù)據(jù)導(dǎo)出模塊

    Tablib是一個(gè)Python的第三方數(shù)據(jù)導(dǎo)出模塊,它支持以下文件格式的導(dǎo)出: Excel JSON YAML Pandas DataFrames HTML Jira TSV ODS CSV DBF
    的頭像 發(fā)表于 11-02 15:57 ?699次閱讀
    Tablib:一<b class='flag-5'>個(gè)</b>Python的第三方<b class='flag-5'>數(shù)據(jù)</b>導(dǎo)出模塊

    Pandas函數(shù)的三個(gè)接口介紹

    本文主要介紹pandas.DataFrame的三個(gè)接口,即assign、eval、query,分別用于賦值、查詢(xún)和執(zhí)行計(jì)算。 01 assign 在數(shù)據(jù)分析處理中,賦值產(chǎn)生新的列是非常高頻的應(yīng)用場(chǎng)
    的頭像 發(fā)表于 11-01 16:38 ?378次閱讀
    <b class='flag-5'>Pandas</b>函數(shù)的三<b class='flag-5'>個(gè)</b>接口介紹

    如何利用Python和pandas來(lái)處理json數(shù)據(jù)

    了如何利用Python和pandas(Python的第三方庫(kù))來(lái)處理json數(shù)據(jù),主要內(nèi)容包含: json數(shù)據(jù)簡(jiǎn)介 常用json數(shù)據(jù)轉(zhuǎn)化網(wǎng)站 json
    的頭像 發(fā)表于 11-01 10:59 ?1672次閱讀
    如何利用Python和<b class='flag-5'>pandas</b>來(lái)處理json<b class='flag-5'>數(shù)據(jù)</b>

    pandas中合并數(shù)據(jù)的5個(gè)函數(shù)

    今天借著這個(gè)機(jī)會(huì),就為大家盤(pán)點(diǎn)一下pandas中合并數(shù)據(jù)的5個(gè)函數(shù)。 join join是基于索引的橫向拼接,如果索引一致,直接橫向拼接。如果索引不一致,則會(huì)用Nan值填充。 索引一致 x
    的頭像 發(fā)表于 10-31 11:11 ?529次閱讀
    <b class='flag-5'>pandas</b>中合并<b class='flag-5'>數(shù)據(jù)</b>的5<b class='flag-5'>個(gè)</b>函數(shù)

    Pandas:Python中最好的數(shù)據(jù)分析工具

    使用 Pandas 分析數(shù)據(jù)的能力。 常見(jiàn)的比如說(shuō): 在處理貨幣值時(shí)使用貨幣符號(hào)。例如,如果您的數(shù)據(jù)包含值 25.00,您不會(huì)立即知道該值是人民幣、美元、英鎊還是其他某種貨幣。 百分比是另一個(gè)
    的頭像 發(fā)表于 10-31 10:47 ?389次閱讀
    <b class='flag-5'>Pandas</b>:Python中最好的<b class='flag-5'>數(shù)據(jù)</b>分析工具

    什么格式是保存Pandas數(shù)據(jù)的最好格式

    數(shù)據(jù)分析相關(guān)項(xiàng)目工作時(shí),我通常使用Jupyter筆記本和pandas庫(kù)來(lái)處理和傳遞我的數(shù)據(jù)。對(duì)于中等大小的數(shù)據(jù)集來(lái)說(shuō),這是一個(gè)非常直接的過(guò)
    的頭像 發(fā)表于 10-30 15:05 ?562次閱讀
    什么格式是保存<b class='flag-5'>Pandas</b><b class='flag-5'>數(shù)據(jù)</b>的最好格式

    盤(pán)點(diǎn)66個(gè)Pandas函數(shù)合集

    今天我們重新盤(pán)點(diǎn)66個(gè)Pandas函數(shù)合集,包括數(shù)據(jù)預(yù)覽、數(shù)值數(shù)據(jù)操作、文本數(shù)據(jù)操作、行/列操作等等,涉及“
    的頭像 發(fā)表于 10-30 09:58 ?1270次閱讀
    盤(pán)點(diǎn)66<b class='flag-5'>個(gè)</b><b class='flag-5'>Pandas</b>函數(shù)合集