Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按日期显示数据帧移位列_Python_Pandas_Dataframe - Fatal编程技术网

Python 按日期显示数据帧移位列

Python 按日期显示数据帧移位列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个面板数据集,该数据集按日期和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编制索引,如下所示:

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
,因此其
2006-09-30
pre_值应为NaN。我也在研究多重索引或将数据集声明为面板,但这会使我的其他计算复杂化。有什么简单的方法可以用dataframe实现这一点吗

我只需复制一个数据帧,将日期偏移1(似乎您希望偏移四分之一),然后合并回原始数据帧。若要转换日期,可以将字符串日期转换为句点,以便更轻松地进行转换

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

我不确定我是否完全明白你想要什么。您想在数据帧中使用以下内容:
2005-12-31
1,2
14,23
?@JoeR很抱歉造成混淆。在原始df中,2006-09-30和ID==1的值是34,而在2006-06-30没有ID==1的值。因此,当我计算上一季度(2006-06-30)的“pre_值”时,pre_值应该等于NaN,而不是将2006-03-31的值移到2006-09-30。太好了,谢谢!如果我按日期和ID对df进行排序,我甚至不需要再按ID分组。