2016-12-16 53 views
1

說我有以下的數據幀,其中包括一系列的「X」熊貓:丟棄不要讓一個完整季度

df = pd.DataFrame({"Date":["201501", "201502", "201503", "201504", "201505", "201506", 
          "201507", "201508", "201509", "201510", "201511", "201512"], 
          "X":[np.nan, np.nan, 100, 101,102,101, np.nan, 104, 103, 104, 
           107, 110]}).set_index("Date") 

In [32]:df 
Out[32]: 
      X 
Date   
201501 NaN 
201502 NaN 
201503 100.0 
201504 101.0 
201505 102.0 
201506 101.0 
201507 NaN 
201508 104.0 
201509 103.0 
201510 104.0 
201511 107.0 
201512 110.0 

我需要的是將降大任月度觀察:」不是個月的觀察意見除了整整四分之一的數據。在上面的例子中,我需要最後一個DataFrame,它是:Q1 = M1,M2,M3,Q2 = M4,M5,M6,Q3 = M7 M8 M9 Q4 M10 M11 M12 :

In [32]:df 
Out[34]: 
      X 
Date   
201501  NaN 
201502  NaN 
201503  NaN 
201504 101.0 
201505 102.0 
201506 101.0 
201507  NaN 
201508  NaN 
201509  NaN 
201510 104.0 
201511 107.0 
201512 110.0 

任何幫助?如果缺少的觀察結果位於數據幀的末尾,我發現了一種做我所需要的方法,但我堅持如何處理中間缺失的值。

+0

的首先想到的是我想到的是重新索引數據框,並在其上設置一個方便的布爾條件。 –

回答

3

您可以重新取樣和計數不在楠的,並基於該條件:

df[df.resample('Q').transform('count') == 3] 
Out: 
       X 
Date    
2015-01-01 NaN 
2015-02-01 NaN 
2015-03-01 NaN 
2015-04-01 101.0 
2015-05-01 102.0 
2015-06-01 101.0 
2015-07-01 NaN 
2015-08-01 NaN 
2015-09-01 NaN 
2015-10-01 104.0 
2015-11-01 107.0 
2015-12-01 110.0 

這假定索引是一個日期時間指數。你可以用df.index = pd.to_datetime(df.index, format='%Y%m')轉換。

+0

完美,謝謝(再次) –

+0

不客氣。 :) – ayhan

1

另一種選擇,可以通過將索引轉換爲四分之一週期創建一組變量,然後檢查每個組是否有基於在創建子集的邏輯矢量任何缺少的值:

index = (df.groupby(pd.to_datetime(df.index, format = "%Y%m").to_period("Q")) 
      .transform(lambda g: g.isnull().any()).X) 

df.loc[index, "X"] = np.nan 

df 
#   X 
#Date 
#201501 NaN 
#201502 NaN 
#201503 NaN 
#201504 101.0 
#201505 102.0 
#201506 101.0 
#201507 NaN 
#201508 NaN 
#201509 NaN 
#201510 104.0 
#201511 107.0 
#201512 110.0