我正在对篮球队进行分析。我一直在使用熊猫,但最近却陷入了如何做一个等同于Excel VLookup的条件。自1985年以来,我拥有所有团队数据(共有30个团队)(一直到2013年)。我添加了一个名为Year3的列,它在Year列上添加了三年。我想在一个新列(我们称之为Perc3)中进行vlookup,它接受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),我想要(Team:Atlanta Hawks)和(Year: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
答案 0 :(得分:0)
如果小组中没有间隙(即在团队中没有跳过年份),则以下情况应该有效。
首先,按[' 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
命令创建百分位列3列:
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
您还可以使用shift
在groupby
/ apply
中完成此操作:
df['ptile3'] = df.groupby('team')['ptile'].apply(lambda x: x.shift(-3))