對於以下dataframe執行dataframe.groupby(['name', 'course']).apply(lambda x: test(x)) 操作
其中test(x)函數為:
def test(x): print(x)
那么打印結果為:
可以發現,groupby()后的第一個結果被打印了兩次。
對於這種情況,Pandas官方文檔的解釋是:
什么意思呢?就是說,apply在第一列/行上調用func兩次,以決定是否可以進行某些優化。
而在pandas==0.18.1以及最新的pandas==0.23.4中進行嘗試后發現,這個情況都存在。
在某些情境,例如對groupby()后的dataframe進行apply()批處理,為了避免重復,我們並不想讓第一個結果打印出兩次。
方法一:
如果能對apply()后第一次出現的dataframe跳過不處理就好了。
這里采用的方法是設置標識符,通過判斷標識符狀態決定是否跳過。代碼如下:
global flag flag = False def test(x): global flag if flag == False: flag = True return print(x)
測試結果為:
可以發現重復的dataframe已經跳過不再打印,問題順利地解決~
方法二:
在上面的分析中,已經找了問題的原因是因為apply()方法的引入。那么,有沒有可以代替apply()方法呢?這里可以采用filter()方法,即用groupby().filter() 代替groupby().apply()。具體代碼如下:
def test(x): print(x) df.groupby(['name', 'course']).filter(lambda x: test(x))
打印出測試結果,也ok~