熊猫时间序列:根据年份和学期查找每个ID的上一个值

时间:2015-03-14 14:23:18

标签: python pandas time-series

我意识到这是一个相当基本的问题,但我无法通过搜索找到我想要的东西(部分原因是因为我不确定如何总结我想要的东西)。在任何情况下:

我的数据框包含以下列:
* ID(每个代表一个特定的大学课程)
*年份 *期限(0 =秋季学期,1 =春季学期)
*评级(从0到5)

我的目标是为Previous Rating创建另一个列。此栏目将等于上次课程举办时的课程评分,并且该课程的第一次提供将为NaN。目标是使用上次提供课程时的课程评级,以预测当前学期的入学率。我正在努力弄清楚如何找到给定行的每个课程的最后一个提供。

感谢您在执行此操作时提供的任何帮助!我在Pandas工作,但如果能让它变得更容易,我可以将我的数据移到R.如果我需要澄清我的问题,请告诉我。

3 个答案:

答案 0 :(得分:3)

我认为有两个关键点:(1)按年份和术语排序,以便顺序对应时间顺序; (2)在选择和转移评级之前,使用groupby收集ID。所以,从像

这样的框架
>>> df
    ID  Year  Term  Rating
0    1  2010     0       2
1    2  2010     0       2
2    1  2010     1       1
3    2  2010     1       0
4    1  2011     0       3
5    2  2011     0       3
6    1  2011     1       4
7    2  2011     1       0
8    2  2012     0       4
9    2  2012     1       4
10   1  2013     0       2

我们得到了

>>> df = df.sort(["ID", "Year", "Term"])
>>> df["Previous_Rating"] = df.groupby("ID")["Rating"].shift()
>>> df
    ID  Year  Term  Rating  Previous_Rating
0    1  2010     0       2              NaN
2    1  2010     1       1                2
4    1  2011     0       3                1
6    1  2011     1       4                3
10   1  2013     0       2                4
1    2  2010     0       2              NaN
3    2  2010     1       0                2
5    2  2011     0       3                0
7    2  2011     1       0                3
8    2  2012     0       4                0
9    2  2012     1       4                4

请注意,我们实际上并不需要按ID进行排序 - 如果没有它,groupby的工作效果会相同 - 但这样就更容易看出转变已经完成正确的事情。阅读split-apply-combine模式可能会有所帮助。

答案 1 :(得分:1)

使用此功能创建新列... DataFrame.shift(句点= 1,freq =无,轴= 0,** kwds) 使用可选的时间频率

按期望的周期数移动索引

答案 2 :(得分:0)

假设你有一个像这样的数据框......

ID  Rating  Term    Year
1   1       0       2002
2   2       1       2003
3   3       0       2004
2   4       0       2005

其中ID是课程ID,您根据年份和学期为每个ID分配多个条目。您的目标是根据ID以及最近的年份和期限查找行。

为此,你可以这样做......

df[((df['Year'] == max(df.Year)) & (df['ID'] == 2) & (df['Term'] == 0))]

我们通过给定的ID和术语以及课程的最后一次提供来找到课程。如果你想要评级,那么你可以做

df[((df['Year'] == max(df.Year)) & (df['ID'] == 2) & (df['Term'] == 0))].Rating

希望你试图完成这个结果。

感谢。