vlookup有熊猫的情况

时间:2014-03-25 23:01:18

标签: python pandas conditional dataframe vlookup

我正在对篮球队进行分析。我一直在使用熊猫,但最近却陷入了如何做一个等同于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

1 个答案:

答案 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

其次,使用shiftwhere命令创建百分位列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

您还可以使用shiftgroupby / apply中完成此操作:

df['ptile3'] = df.groupby('team')['ptile'].apply(lambda x: x.shift(-3))