熊猫:放下观察结果不完整的四分之一

时间:2016-12-16 15:21:45

标签: python pandas

假设我有以下DataFrame,其中包括系列“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

我需要的是删除任何不是整个四分之一数据的月度观察。四分之一是Q1 = M1,M2,M3,Q2 = M4,M5,M6,Q3 = M7,M8,M9,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

有任何帮助吗?如果遗漏的观察结果出现在数据框的末尾,我找到了一种方法来做我需要的东西,但我仍然坚持如何处理中间的缺失值。

2 个答案:

答案 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

这假设index是一个日期时间索引。您可以使用df.index = pd.to_datetime(df.index, format='%Y%m')进行转换。

答案 1 :(得分: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