2016-12-16 10 views
1

は私が必要なものパンダ:

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 

私はシリーズ「X」の毎月の観測を含み、次のデータフレームを、持っていると言う完全な四半期を作るいけないの観測をドロップすると、「にISN任意の毎月の観察をドロップすることですデータの4分の1を占めています。 Q4 = M10、M11、M12

上記の例では、最終的なDataFrameが必要です。 :

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

あなたはリサンプリングとカウントNaNではないものを、その条件に基づいて選択することができます。

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 

これは、インデックスがdatetime型の指標である前提としています。 df.index = pd.to_datetime(df.index, format='%Y%m')に変換できます。

+0

パーフェクト、ありがとう(やはり) –

+0

あなたはようこそ。 :) – ayhan

1

別のオプション、あなたは4分の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