用无序索引移动数据帧中的列

2024-06-28 11:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含许多行的pandas dataframe,由PeriodIndex索引。我需要做的是添加一个列,其中的数据来自其他一些列,但在时间上发生了变化。你知道吗

因此,我知道我必须使用shift或tshift方法。但是,我有一个复杂的问题:我不确定索引是否已排序。我无法检查这一点,因为实际上我正在执行的操作是在groupby函数中进行的(具体来说:原始索引不是按日期排序的,但是在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

然而,这三种方法真的是等价的吗?如果没有,哪一个是正确的使用?如果是的话,出于某些原因,这些方法中有哪一种比其他方法更可取?你知道吗


Tags: to方法indataframepandasdfshift排序