Pandas?Query方法使用深度總結(jié)

    目錄

    大多數(shù) Pandas 用戶都熟悉 iloc[] 和 loc[] 索引器方法,用于從 Pandas DataFrame 中檢索行和列。但是隨著檢索數(shù)據(jù)得規(guī)則變得越來越復(fù)雜,這些方法也隨之變得更加復(fù)雜而臃腫。

    同時(shí) SQL 也是我們經(jīng)常接觸且較為熟悉得語言,那么為什么不使用類似于 SQL 得東西來查詢我們得數(shù)據(jù)呢

    事實(shí)證明實(shí)際上可以使用 query() 方法做到這一點(diǎn)。因此,在今天得內(nèi)容中,我們將展示如何使用 query() 方法對(duì)數(shù)據(jù)框執(zhí)行查詢

    獲取數(shù)據(jù)

    我們使用 kaggle 上得 Titanic 數(shù)據(jù)集作為本內(nèi)容得測(cè)試數(shù)據(jù)集,下載地址如下:https://www.kaggle.com/datasets/tedllh/titanic-train

    當(dāng)然也可以在文末獲取到蘿卜哥下載好得數(shù)據(jù)集

    載入數(shù)據(jù)

    下面文末就可以使用 read_csv 來載入數(shù)據(jù)了

    import?pandas?as?pddf?=?pd.read_csv('titanic_train.csv')df

    數(shù)據(jù)集有 891 行和 12 列:

    使用 query() 方法

    讓我們找出從南安普敦 (‘S’) 出發(fā)得所有乘客,可以使用方括號(hào)索引,代碼如下所示:

    df[df['Embarked']?==?'S']

    如果使用 query() 方法,那么看起來更整潔:

    df.query('Embarked?==?"S"')

    與 SQL 比較,則 query() 方法中得表達(dá)式類似于 SQL 中得 WHERE 語句。

    結(jié)果是一個(gè) DataFrame,其中包含所有從南安普敦出發(fā)得乘客:

    query() 方法接受字符串作為查詢條件串,因此,如果要查詢字符串列,則需要確保字符串被正確括起來:

    很多時(shí)候,我們可能希望將變量值傳遞到查詢字符串中,可以使用 @ 字符執(zhí)行此操作:

    embarked?=?'S'df.query('Embarked?==?@embarked')

    或者也可以使用 f 字符串,如下所示:

    df.query(f'Embarked?==?"{embarked}"')

    就個(gè)人而言,我認(rèn)為與 f-string 方式相比,使用 @ 字符更簡(jiǎn)單、更優(yōu)雅,你認(rèn)為呢

    如果列名中有空格,可以使用反引號(hào) (``) 將列名括起來:

    df.query('`Embarked?On`?==?@embarked')

    以 In-place 得方式執(zhí)行 query 方法

    當(dāng)使用 query() 方法執(zhí)行查詢時(shí),該方法將結(jié)果作為 DataFrame 返回,原始 DataFrame 保持不變。如果要更新原始 DataFrame,需要使用 inplace 參數(shù),如下所示:

    df.query('Embarked?==?"S"',?inplace=True)

    當(dāng) inplace 設(shè)置為 True 時(shí),query() 方法將不會(huì)返回任何值,原始 DataFrame 被修改。

    指定多個(gè)條件查詢

    我們可以在查詢中指定多個(gè)條件,例如假設(shè)我想獲取所有從南安普敦 (‘S’) 或瑟堡 (‘C’) 出發(fā)得乘客。如果使用方括號(hào)索引,這種語法很快變得非常笨拙:

    df[(df['Embarked']?==?'S')?|?(df['Embarked']?==?'C')]

    我們注意到,在這里我們需要在查詢得條件下引用 DataFrame 兩次,而使用 query() 方法,就簡(jiǎn)潔多了:

    df.query('Embarked?in?("S","C")')

    查詢結(jié)果如下

    如果要查找所有不是從南安普敦(‘S’)或瑟堡(‘C’)出發(fā)得乘客,可以在 Pandas 中使用否定運(yùn)算符 (~):

    df[~((df['Embarked']?==?'S')?|?(df['Embarked']?==?'C'))]

    使用 query() 方法,只需要使用 not 運(yùn)算符:

    df.query('Embarked?not?in?("S","C")')

    以下輸出顯示了從皇后鎮(zhèn) (‘Q’) 出發(fā)得乘客以及缺失值得乘客:

    說到缺失值,該怎么查詢?nèi)笔е的兀?dāng)應(yīng)用于列名時(shí),我們可以使用 isnull() 方法查找缺失值:

    df.query('Embarked.isnull()')

    現(xiàn)在將顯示 Embarked 列中缺少值得行:

    其實(shí)可以直接在列名上調(diào)用各種 Series 方法:

    df.query('Name.str.len()?<?20')??#?find?passengers?whose?name?is??????????????????????????????????#?less?than?20?charactersdf.query(f'Ticket.str.startswith("A")')?#?find?all?passengers?whose?????????????????????????????????????????#?ticket?starts?with?A

    比較數(shù)值列

    我們還可以輕松比較數(shù)字列:

    df.query('Fare?>?50')

    以下輸出顯示了票價(jià)大于 50 得所有行:

    比較多個(gè)列

    還可以使用 and、or 和 not 運(yùn)算符比較多個(gè)列,以下語句檢索 Fare 大于 50 和 Age 大于 30 得所有行:

    df.query('Fare?>?50?and?Age?>?30')

    下面是查詢結(jié)果

    查詢索引

    通常當(dāng)我們想根據(jù)索引值檢索行時(shí),可以使用 loc[] 索引器,如下所示:

    df.loc[[1],:]??#?get?the?row?whose?index?is?1;?return?as?a?dataframe

    但是使用 query() 方法,使得事情變得更加直觀:

    df.query('index==1')

    結(jié)果如下

    如果要檢索索引值小于 5 得所有行:

    df.query('index<5')

    結(jié)果如下

    我們還可以指定索引值得范圍:

    df.query('6?<=?index?<?20')

    結(jié)果如下

    比較多列

    我們還可以比較列之間得值,例如以下語句檢索 Parch 值大于 SibSp 值得所有行:

    df.query('Parch?>?SibSp')

    結(jié)果如下

    總結(jié)

    從上面得示例可以看出,query() 方法使搜索行得語法更加自然簡(jiǎn)潔,希望感興趣得小伙伴多加練習(xí),真正得達(dá)到融會(huì)貫通得地步哦~

    到此這篇關(guān)于Pandas Query方法使用深度總結(jié)得內(nèi)容就介紹到這了,更多相關(guān)Pandas Query方法內(nèi)容請(qǐng)搜索之家以前得內(nèi)容或繼續(xù)瀏覽下面得相關(guān)內(nèi)容希望大家以后多多支持之家!

    聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
    發(fā)表評(píng)論
    更多 網(wǎng)友評(píng)論1 條評(píng)論)
    暫無評(píng)論

    返回頂部

    主站蜘蛛池模板: 波多野结衣一区二区| 久久一区二区精品综合| 无码视频一区二区三区| 亲子乱AV视频一区二区| 国产一区二区在线视频| 精品无码一区在线观看| 日韩在线视频一区| 国产精品免费大片一区二区| 国产日韩AV免费无码一区二区三区| 插我一区二区在线观看| 无码国产伦一区二区三区视频| 亚洲一区中文字幕| 麻豆va一区二区三区久久浪| 精品理论片一区二区三区| 免费无码毛片一区二区APP| 日韩美一区二区三区| 日韩欧国产精品一区综合无码| 国精产品999一区二区三区有限| 色综合视频一区二区三区| 精品午夜福利无人区乱码一区| 一本色道久久综合一区| 亚州AV综合色区无码一区| 亚洲一区综合在线播放| 中文字幕一区二区三区有限公司| 亚洲一区免费视频| 精品一区二区久久久久久久网站| 麻豆一区二区免费播放网站| 久久久久人妻精品一区三寸蜜桃| 日韩精品一区二区三区国语自制 | 无码少妇一区二区三区| 日本免费精品一区二区三区| 国产一区二区好的精华液| 亚洲一区二区三区高清视频| 蜜桃传媒视频麻豆第一区| 伊人激情AV一区二区三区| 亚洲V无码一区二区三区四区观看| 一级毛片完整版免费播放一区| 色视频综合无码一区二区三区 | 国产大秀视频一区二区三区| 无码人妻精品一区二区三区久久久 | 一区二区三区视频|