熊猫与groupby()滚动()以奇怪的方式更改索引

时间:2019-04-12 15:42:20

标签: python pandas

假设我有一个> rowSums((t(A) * a) !=0) [1] 2 2 1 DataFrame,就像这样:

MultiIndex

如果我要创建import pandas as pd import numppy as np iterables = [[1,2],['2011Q4','2012Q1','2012Q2','2012Q3','2012Q4','2013Q1','2013Q2','2013Q4']] data = pd.DataFrame(np.random.random((16,1)), columns=['val'], \ index=pd.MultiIndex.from_product(iterables,names=['id','date'])) 的滞后,则可以这样做:

val

产生

data['val_lag1'] = data.groupby(level=0)['val'].shift(1)

但是,当我尝试与 val val_lag1 id date 1 2011Q4 0.215183 NaN 2012Q1 0.929456 0.215183 2012Q2 0.171601 0.929456 2012Q3 0.387254 0.171601 2012Q4 0.805295 0.387254 2013Q1 0.592925 0.805295 2013Q2 0.446619 0.592925 2013Q4 0.962464 0.446619 2 2011Q4 0.723046 NaN 2012Q1 0.840808 0.723046 2012Q2 0.249003 0.840808 2012Q3 0.306059 0.249003 2012Q4 0.199025 0.306059 2013Q1 0.815567 0.199025 2013Q2 0.835140 0.815567 2013Q4 0.322251 0.835140 做本质上非常相似的操作时,该操作不起作用,因为它在过程中重复了一级索引。也就是说,无法分配

rolling()

看起来自然/显而易见,因为 data['val_ma4'] = data.groupby(level=0)['val'].rolling(4).mean() 现在具有第三级索引:

data.groupby(level=0)['val'].rolling(4).mean()

我可以摆脱额外的索引级别,但是为什么它会出现,为什么我必须这样做?对我来说,我必须这样做是没有道理的:

id  id  date  
1   1   2011Q4         NaN
        2012Q1         NaN
        2012Q2         NaN
        2012Q3    0.466110
        2012Q4    0.392576
        2013Q1    0.408187
        2013Q2    0.432501
        2013Q4    0.600802
2   2   2011Q4         NaN
        2012Q1         NaN
        2012Q2         NaN
        2012Q3    0.535583
        2012Q4    0.463489
        2013Q1    0.639357
        2013Q2    0.683905
        2013Q4    0.686587
Name: val, dtype: float64

1 个答案:

答案 0 :(得分:3)

在这种情况下,您需要使用apply()

data['val_ma4'] = data.groupby(level=0)['val'].apply(lambda x: x.rolling(4).mean())

您将获得所需的输出:

                val  val_lag1   val_ma4
id date                                
1  2011Q4  0.071332       NaN       NaN
   2012Q1  0.738045  0.071332       NaN
   2012Q2  0.578402  0.738045       NaN
   2012Q3  0.670338  0.578402  0.514529
   2012Q4  0.595443  0.670338  0.645557
   2013Q1  0.389000  0.595443  0.558296
   2013Q2  0.632672  0.389000  0.571863
   2013Q4  0.031375  0.632672  0.412123
2  2011Q4  0.860161       NaN       NaN
   2012Q1  0.337713  0.860161       NaN
   2012Q2  0.480819  0.337713       NaN
   2012Q3  0.167317  0.480819  0.461502
   2012Q4  0.650774  0.167317  0.409156
   2013Q1  0.197799  0.650774  0.374178
   2013Q2  0.417418  0.197799  0.358327
   2013Q4  0.705662  0.417418  0.492913