Pandas变量的时间滞后

时间:2015-09-02 19:03:08

标签: python pandas

Pandas计算空间单位内变量列表的时间滞后的最佳方法是什么?

假设我有一个看起来像这样的Pandas数据框:

>>> MyData=pd.DataFrame(columns=['Year','Location','Var1','Var2'], data=[[2001, 'A',1,2],[2002, 'A',3,4],[2003, 'A',5,6],[2001, 'B',7,8],[2002, 'B',9,10],[2003, 'B',11,12]])

>>> print MyData
   Year Location  Var1  Var2
0  2001        A     1     2
1  2002        A     3     4
2  2003        A     5     6
3  2001        B     7     8
4  2002        B     9    10
5  2003        B    11    12
>>> 

我想要一个新的数据框,每个位置都采用上一年的Var1和Var2值。数据框将减少1年,因为你不能滞后第一年。

我写了一个这样做的功能,但感觉有点笨重,我想知道是否有办法改进它或更有效地做到这一点。关于如何改进我的代码的任何建议将不胜感激。

>>> def TimeLag(df, TimeVar, LocationVar, LagVars):
...     AllPeriods=sorted(df[TimeVar].unique().tolist())
...     ResultList=[]
...     for Period in AllPeriods[1:]:      
...         d=df[df[TimeVar]==Period][[TimeVar, LocationVar]]        
...         dtlag=df[df[TimeVar]==Period-1][[LocationVar]+LagVars]
...         d=pd.merge(d, dtlag, on='Location')        
...         d=d.rename(columns={Var:Var+'_tlag' for Var in LagVars})
...         ResultList.append(d)        
...     Final=pd.concat(ResultList).reset_index(drop=True)     
...     return Final        
... 
>>> 
>>> print TimeLag(MyData, 'Year','Location', ['Var1','Var2'])
   Year Location  Var1_tlag  Var2_tlag
0  2002        A          1          2
1  2002        B          7          8
2  2003        A          3          4
3  2003        B          9         10
>>> 

2 个答案:

答案 0 :(得分:2)

好的,在查看了您想要的内容之后,在执行shift然后groupby之后,您可以更快地获取第一行,然后concat其余的df :

In [77]:
first = MyData[MyData['Year']==2001]
first

Out[77]:
   Year Location  Var1  Var2
0  2001        A     1     2
3  2001        B     7     8

In [80]:    
rest = MyData[MyData['Year']!=2001]
rest = rest.groupby('Location',as_index=False).shift().dropna()
pd.concat([first,rest])
Out[80]:
   Year Location  Var1  Var2
0  2001        A     1     2
3  2001        B     7     8
2  2002        A     3     4
5  2002        B     9    10

答案 1 :(得分:1)

def lag_year(df):
    shifted_years = df.shift().dropna(how = 'all')
    years = df.iloc[1:]
    final = pd.DataFrame({'Year' : years.Year  , 'Var1' : shifted_years.Var1 , 'Var2' : shifted_years.Var2})
    return final

MyData.groupby('Location').apply(lag_year).reset_index().drop('level_1' , axis = 1)

Location    Var1    Var2    Year
    A         1        2    2002
    A         3        4    2003
    B         7        8    2002
    B         9       10    2003

如果你想要你可以按年份排序

MyData.groupby('Location').apply(lag_year).reset_index().drop('level_1' , axis = 1).sort_index(by = 'Year')