在pandas中使用条件的vlookup

0 投票
1 回答
1843 浏览
提问于 2025-04-17 23:53

我正在分析篮球队的数据。我一直在用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 个回答

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 命令来创建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))

撰写回答