我有一个包含很多行的pandas datafrrame,由PeriodIndex索引。我需要做的是添加一个列,其中包含来自其他一些列的数据,但时间会发生变化。
出于这个原因,我知道我必须使用shift或tshift方法。但是,我有一个复杂的问题:我不确定索引是否已排序。我无法检查这个,因为实际上我正在执行的操作是在groupby函数内(具体来说:ORIGINAL索引没有按日期排序,但是在groupby方法的每个组中它应该是 - 但我不是100%肯定)
简而言之,我想确保附加列在前一个时间段从原始列中获取数据 - 这可能与上面的行不一致。我还希望不会创建额外的行(在原始行中的最后一行之后)。
以下是我尝试的三种方法,它们提供相同的输出并且似乎有效。
In [1]: df = pd.DataFrame(data=[1,2,3,4], index=pd.to_datetime([2011, 2012, 2010, 2013], format='%Y').to_period(freq='Y'))
In [2]: df
Out[2]:
0
2011 1
2012 2
2010 3
2013 4
In [3]: df['A'] = df.loc[:,0].shift(freq='Y')
In [4]: df['B'] = df.loc[:,0].tshift(1)
In [5]: df['C'] = df.loc[:,0].tshift(freq='Y')
In [6]: df
Out[6]:
0 A B C
2011 1 3.0 3.0 3.0
2012 2 1.0 1.0 1.0
2010 3 NaN NaN NaN
2013 4 2.0 2.0 2.0
然而,这三种方法真的相同吗?如果没有,哪个是正确的?如果是的话,出于某些原因,这些是否优于其他原因?