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
>>>
答案 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')