在pandas中使用条件的vlookup
我正在分析篮球队的数据。我一直在用pandas这个工具,但最近遇到了一个问题,就是怎么做类似Excel中的VLookup功能,而且还要加上条件。我有所有球队的数据(总共有30支球队),从1985年到2013年都有。我添加了一个叫做Year3的列,这个列是在Year的基础上加了三年。我想在一个新的列(我们叫它Perc3)中做一个查找,取Year的值并返回对应的百分位数。让我感到困惑的是,这个查找需要同时匹配年份和球队。
Team Year Percentile WLPer LgRnk W L Year3
308 Atlanta Hawks 1997 0.793103 0.683 23 56 26 2000
23 Atlanta Hawks 1986 0.782609 0.610 18 50 32 1989
69 Atlanta Hawks 1988 0.695652 0.610 16 50 32 1991
337 Atlanta Hawks 1998 0.689655 0.610 20 50 32 2001
252 Atlanta Hawks 1995 0.518519 0.512 14 42 40 1998
395 Atlanta Hawks 2000 0.172414 0.341 5 28 54 2003
比如第一行(标记为308),Year3是2000。对于我想创建的那一列(Perc3),我想要的是(球队:Atlanta Hawks)和(年份:2000)对应的百分位数。有没有简单的方法可以做到这一点呢?
预期的输出结果:
Team Year Percentile WLPer LgRnk W L Year3 Perc3
308 Atlanta Hawks 1997 0.793103 0.683 23 56 26 2000 0.172414
23 Atlanta Hawks 1986 0.782609 0.610 18 50 32 1989 0.840000
69 Atlanta Hawks 1988 0.695652 0.610 16 50 32 1991 0.555556
337 Atlanta Hawks 1998 0.689655 0.610 20 50 32 2001 0.172414
252 Atlanta Hawks 1995 0.518519 0.512 14 42 40 1998 0.689655
395 Atlanta Hawks 2000 0.172414 0.341 5 28 54 2003 0.275862
1 个回答
如果面板中没有空缺(也就是说,在一个团队内没有年份被跳过),那么以下方法应该可以正常工作。
首先,按照['team','year']的顺序进行排序,这样你的面板看起来会像下面这样:
df = df.sort(['team','year'])
print df
team year ptile
0 A 2000 0.40
1 A 2001 0.42
2 A 2002 0.46
3 A 2003 0.30
4 A 2004 0.38
5 A 2005 0.40
6 A 2006 0.35
7 A 2007 0.50
8 B 2000 0.60
9 B 2001 0.70
10 B 2002 0.55
11 B 2003 0.65
12 B 2004 0.75
13 B 2005 0.72
14 B 2006 0.66
15 B 2007 0.56
接下来,使用 shift
和 where
命令来创建percentile3这一列:
same_team = df.team == df.team.shift(-3)
df['ptile3'] = df['ptile'].shift(-3).where(same_team)
print df
team year ptile ptile3
0 A 2000 0.40 0.30
1 A 2001 0.42 0.38
2 A 2002 0.46 0.40
3 A 2003 0.30 0.35
4 A 2004 0.38 0.50
5 A 2005 0.40 NaN
6 A 2006 0.35 NaN
7 A 2007 0.50 NaN
8 B 2000 0.60 0.65
9 B 2001 0.70 0.75
10 B 2002 0.55 0.72
11 B 2003 0.65 0.66
12 B 2004 0.75 0.56
13 B 2005 0.72 NaN
14 B 2006 0.66 NaN
15 B 2007 0.56 NaN
你也可以在 groupby
/apply
中使用 shift
来实现这个功能:
df['ptile3'] = df.groupby('team')['ptile'].apply(lambda x: x.shift(-3))