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 模式可能会有帮助。
我知道这是一个相当基本的问题,但我无法通过搜索找到我要找的东西(部分原因是我不确定如何总结我想要的东西)。无论如何:
我有一个包含以下列的数据框:
* 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 模式可能会有帮助。