使用shift()处理不均匀间距的数据

3
希望这个例子可以说明问题。我想用shift()创建“lagval”,但需要在前一年缺失时将其设置为nan。
df = DataFrame( { 'yr' : [2007,2008,2009,2011,2012],
                  'val': np.random.randn(5) } )

期望输出(lagval):

In [1118]: df
Out[1118]: 
        val    yr    lagval
0 -0.978139  2007       NaN
1  0.117912  2008 -0.978139
2 -1.031884  2009  0.117912
3  0.606856  2011       NaN
4 -0.200864  2012  0.606856

我有一个不错的解决方案(已发布为答案),但希望寻找其他选择。我花了一些时间查看了所有时间序列函数,但似乎在这里使用它们有点过头了。看起来我需要将年份转换为真正的时间戳,重新采样、偏移,然后删除缺失的值。但也许有更简单的方法?

1个回答

3

说实话,这里有一个时间序列的解决方案,显然需要写更多的代码。

df = df.set_index(df['yr'].apply(lambda x: datetime.datetime(x, 1, 1)))
df = df.resample('A').mean()

df['lagval'] = df['val'].shift(1)
df = df[pd.notnull(df['yr'])]

我对Stata不太熟悉,但是简单浏览文档之后,似乎tsset函数可以做类似的事情(将数据转换为指定频率的格式)?


谢谢,很高兴看到这种方式,并不像我想象的那么糟糕。Stata的tsset仅用于为面板数据集定义组和时间变量,之后您可以进行滞后/重塑等操作,而Stata会知道如何处理这些内容。有点像在pandas中堆叠之前设置索引。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接