本文主要介紹pandas.DataFrame的三個(gè)接口,即assign、eval、query,分別用于賦值、查詢(xún)和執(zhí)行計(jì)算。
01 assign
在數(shù)據(jù)分析處理中,賦值產(chǎn)生新的列是非常高頻的應(yīng)用場(chǎng)景,簡(jiǎn)單的可能是賦值常數(shù)列、復(fù)雜的可能是由一列產(chǎn)生另外一個(gè)一列,對(duì)于這種需求pandas有多種方法實(shí)現(xiàn),但個(gè)人唯獨(dú)喜歡assign,用起來(lái)優(yōu)雅高效。
例如,對(duì)于以上簡(jiǎn)單的DataFrame數(shù)據(jù)框,需要?jiǎng)?chuàng)建一個(gè)新的列C,一般來(lái)說(shuō)可能有3種創(chuàng)建需求:常數(shù)列、指定序列數(shù)據(jù)以及由已知列通過(guò)一定計(jì)算產(chǎn)生。那么應(yīng)用assign完成這3個(gè)需求分別是:
注意事項(xiàng):
- assign賦值新列時(shí),一般用新列名=表達(dá)式的形式,其中新列名為變量的形式,所以不加引號(hào)(加引號(hào)時(shí)意味著是字符串);
- assign返回創(chuàng)建了新列的dataframe,所以需要用新的dataframe對(duì)象接收返回值;
- assign不僅可用于創(chuàng)建新的列,也可用于更新已有列,此時(shí)創(chuàng)建的新列會(huì)覆蓋原有列。
02 eval
實(shí)際上,eval是一個(gè)Python基礎(chǔ)函數(shù),用于執(zhí)行字符串形式的計(jì)算表達(dá)式,例如以下簡(jiǎn)單實(shí)例:
那么,eval作為pandas.dataframe數(shù)據(jù)結(jié)構(gòu)的一個(gè)接口,執(zhí)行功能應(yīng)該也與執(zhí)行計(jì)算有關(guān)。另一方面,pandas中實(shí)際上是內(nèi)置了大量的SQL類(lèi)語(yǔ)法(包括下面要介紹的query也是),而eval的功能正是執(zhí)行類(lèi)似SQL語(yǔ)法中的計(jì)算,對(duì)已知列執(zhí)行一定的計(jì)算時(shí)可用eval完成。例如,仍以前述由A和B列產(chǎn)生C列為例,應(yīng)用eval的方法為:
了解SQL語(yǔ)法的都知道可用@前綴修飾自定義變量,這一用法在這里的eval中也得以保留,此時(shí)可非常方便的引用外部變量。當(dāng)然,eval中的計(jì)算表達(dá)式本身屬于字符串形式,所以自然也可以用Python的通用字符串引用方法。如下圖所示。
注意事項(xiàng):
- eval支持接收一個(gè)inplace參數(shù)控制原地創(chuàng)建新變量或者返回新的dataframe;也支持僅用表達(dá)式而不設(shè)置新變量名,此時(shí)返回?cái)?shù)據(jù)為series格式,如下圖所示;
- eval表達(dá)式中也支持調(diào)用函數(shù)執(zhí)行復(fù)雜計(jì)算。
03 query
這應(yīng)該是最近使用最為頻繁的一個(gè)接口了,pandas中雖然也提供了多種數(shù)據(jù)篩選方式,例如loc中增加表達(dá)式、或者直接用df[df[]……]等等,但總覺(jué)得用起來(lái)不夠優(yōu)雅,尤其是要寫(xiě)兩遍df以及[]等等,此時(shí)如果靈活運(yùn)用query函數(shù),那么會(huì)便捷不少。尤其是query也是類(lèi)似于SQL中where關(guān)鍵字的語(yǔ)法邏輯,用起來(lái)會(huì)很順滑。
例如對(duì)于以上dataframe,需要根據(jù)不同場(chǎng)景查詢(xún)滿(mǎn)足條件的記錄,調(diào)用query的實(shí)現(xiàn)方式為:
當(dāng)然,之所以說(shuō)query中支持類(lèi)似SQL的語(yǔ)法,是因?yàn)槠湟灿袃蓚€(gè)SQL中標(biāo)志性的設(shè)計(jì),其一是@引用自定義外部變量,其二是對(duì)于特殊的列名(例如包含空格的字符)可以用反引號(hào)``加以修飾引用。例如,下述例子中C C列中有個(gè)空格,直接用于字符串表達(dá)式會(huì)存在報(bào)錯(cuò),此時(shí)可使用反引號(hào)加以修飾,同時(shí)查詢(xún)條件中應(yīng)用了@修飾符引用外部變量。當(dāng)然,與eval中類(lèi)似,這里當(dāng)然也可以用f字符串修飾引用。
注意事項(xiàng):
- query中也支持inplace參數(shù),控制是否將查詢(xún)過(guò)濾條件作用于dataframe本身;
- 與eval類(lèi)似,query中也支持引用外部函數(shù)。
-
接口
+關(guān)注
關(guān)注
33文章
8691瀏覽量
151784 -
字符串
+關(guān)注
關(guān)注
1文章
585瀏覽量
20586 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62913
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論