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