Pandas 时间序列:根据年份和学期查找每个 ID 的先前值

Pandas Time-Series: Find previous value for each ID based on year and semester

我知道这是一个相当基本的问题,但我无法通过搜索找到我要找的东西(部分原因是我不确定如何总结我想要的东西)。无论如何:

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

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

对于执行此操作的任何帮助,我将不胜感激!我在 Pandas 工作,但如果这样更容易,我可以将我的数据移至 R。如果我需要澄清我的问题,请告诉我。

使用此函数创建新列... DataFrame.shift(周期=1,频率=None,轴=0,**kwds) 使用可选的时间频率

按所需的周期数移动索引

假设您有这样的数据框...

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

希望你正在努力实现这个结果。

谢谢。

我认为有两个关键点:(1)按Year和Term排序,使顺序对应于时间顺序; (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 模式可能会有帮助。