2015-10-19 33 views
0

如何在舊數據框上使用apply函數時返回新的數據框?如何在舊數據框上使用apply函數時返回新的數據框?

輸入數據(DF):

                                                       個     預訂rolling_mean rolling_std_dev
DS                              城市
2013-01-01 City_2 69                      的NaN                          的NaN
2013年1月2日City_2 101                  的NaN                          的NaN
2013年1月3日City_2 134                 101.333333     32.501282
2013年1月4日City_2 155                 130.000000     27.221315
2013-01 -05 City_2 104                 131.000000     25。632011

代碼:

def f1(x): 
    if (math.isnan(x.bookings) or math.isnan(x.rolling_mean) or math.isnan(x.rolling_std_dev)): 
     print "Not enough information" 
    elif abs(x.bookings-x.rolling_mean) > (2*x.rolling_std_dev): 
     print x.bookings 
     print x.rolling_mean 
     print x.rolling_std_dev 

df.apply(lambda x: f2(x), axis = 1) 

輸出:

enter image description here

問題:

函數上述正確地與沒有錯誤編譯。但是,當我嘗試運行它時,它不會提供我想要的輸出。它不是在elif語句之後打印任何東西,但它應該。另外,我不理解在輸出的打印部分之後顯示所有非數字的數據幀。那來自哪裏?

我想要的解決方案:

返回與該履行的elif語句中的所有行一個新的數據幀。

+0

你在新的數據幀想要什麼?你只是想刪除其中含有「NaN」的行嗎? –

+0

人們多次向您解釋說,插入圖片比插入文字要少得多,因爲'read_clipboard'不適用於圖片;這仍然是事實。 FWIW,許多熊貓標籤的追隨者只是跳過不遵循[mcve]規則的問題。 – DSM

+0

對不起,我其實不知道read_clipboard是如何工作的。我修好了,不會再發布圖片。在這個新的數據框中,我需要滿足elif語句的行。 – pr338

回答

2

當函數調用沒有顯式地返回任何東西時,它返回None(因爲所有的函數調用都必須返回Python中的某些東西,並且如果函數中沒有顯式返回任何內容,那麼默認返回值是None)。

這就是爲什麼你會得到所有None的數據幀。我不認爲你可以通過apply來達到你想要的效果,因爲apply()1實際上爲每一行運行函數,並用返回值替換該行(正如你在案例中看到的那樣)。

newdf = df.dropna() 
result = newdf[(newdf['bookings'] - newdf['rolling_mean']) > (2 * newdf['rolling_std_dev'])] 

說明 - -

  • df.dropna() -

    什麼你正在嘗試做的可以量化的方式使用來實現此功能下降的任何行與NaN值是

  • 下一行做了一系列的布爾比較(它對每個元素進行相同的bool比較並返回布爾序列),a那麼它確實boolean indexing

演示(我改了行,以便有ATLEAST一個行會的條件) -

In [50]: df 
Out[50]: 
        bookings rolling_mean rolling_std_dev 
ds   city 
2013-01-01 City_2  69   NaN    NaN 
2013-01-02 City_2  101   NaN    NaN 
2013-01-03 City_2  134 101.333333  32.501282 
2013-01-04 City_2  155 130.000000  27.221315 
2013-01-05 City_2  1000 131.000000  25.632011 

In [51]: newdf = df.dropna() 

In [52]: result = newdf[(newdf['bookings'] - newdf['rolling_mean']) > (2 * newdf['rolling_std_dev'])] 

In [53]: result 
Out[53]: 
        bookings rolling_mean rolling_std_dev 
ds   city 
2013-01-05 City_2  1000   131  25.632011 
相關問題