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