我有一个面板数据集,它按日期和ID索引,看起来像这样:
df = pd.DataFrame({'Date':['2005-12-31', '2006-03-31', '2006-09-30','2005-12-31', '2006-03-31', '2006-06-30', '2006-09-30'],
'ID':[1,1,1,2,2,2,2],
'Value':[14,25,34,23,67,14,46]})
我正在尝试按日期和日期移动相同ID的值可以是非连续的季度。 groupby.shift没有给我正确的东西,也许我错过了什么。这是我做的:
df['pre_value'] = df.groupby('ID')['Value'].shift(1)
这确实会移动相同ID的值,但会忽略日期...请注意,对于ID==1
,2006-06-30
缺失,因此pre_value
为2006-09-30
应该真的是NaN。我也在研究多索引或将数据集声明为面板,但这使我的其他计算变得复杂。有没有简单的方法来使用dataframe?
答案 0 :(得分:2)
我只是制作数据帧的副本,将Date
移动1(似乎您想要移动四分之一),然后合并回原始数据帧。要转换日期,您可以将字符串日期转换为pandas时段,以便更轻松地进行转换。
In [34]: df['Date'] = pd.PeriodIndex(df['Date'], freq='Q')
In [35]: df2 = df.copy()
In [36]: df2['Date'] += 1
In [37]: df.merge(df2, on=['Date','ID'], suffixes=('', '_lag1'), how='left')
Out[37]:
Date ID Value Value_lag1
0 2005Q4 1 14 NaN
1 2006Q1 1 25 14
2 2006Q3 1 34 NaN
3 2005Q4 2 23 NaN
4 2006Q1 2 67 23
5 2006Q2 2 14 67
6 2006Q3 2 46 14