Python 如何使用Pandas使用两列作为VLOOKUP的索引来执行条件VLOOKUP?
我对Pandas和Python非常陌生,我根本不知道如何在Excel中轻松完成一些事情。我希望能从社区得到一些帮助 假设我有以下内容,这是一个与幻想足球有关的df,有三列-‘名称’、‘年份’和‘幻想王国’。代码如下Python 如何使用Pandas使用两列作为VLOOKUP的索引来执行条件VLOOKUP?,python,pandas,dataframe,vlookup,Python,Pandas,Dataframe,Vlookup,我对Pandas和Python非常陌生,我根本不知道如何在Excel中轻松完成一些事情。我希望能从社区得到一些帮助 假设我有以下内容,这是一个与幻想足球有关的df,有三列-‘名称’、‘年份’和‘幻想王国’。代码如下 import pandas as pd df = pd.DataFrame({'Name': ['Tom Brady', 'Tom Brady', 'Tom Brady', 'Patrick Mahomes', 'Patrick Mahomes', 'Patrick Mahomes
import pandas as pd
df = pd.DataFrame({'Name': ['Tom Brady', 'Tom Brady', 'Tom Brady', 'Patrick Mahomes', 'Patrick Mahomes', 'Patrick Mahomes'],
'Year': [2019, 2018, 2017, 2019, 2018, 2017],
'FantasyPts': [300, 350, 400, 500, 400, 50],
})
我想在表中添加另一列,名为“FantasyPtsPreviousYear”,但在Pandas/Python中很难弄清楚如何做到这一点
我想做的是:
谢谢你能提供的任何帮助!我非常感谢它,并认为这个社区为它提供的所有帮助是令人敬畏的 我相信这可以通过结合
where()
和shift()
来实现。但是,这需要对数据进行预先排序。以下是您提供的数据的代码:
df = df.sort_values(['Name','Year'],ascending=[True,True])
df['FantasyPtsPreviousYear'] = df['FantasyPts'].shift().where(df['Name'].eq(df['Name'].shift())).fillna(0)
print(df)
这将产生:
Name Year FantasyPts FantasyPtsPreviousYear
5 Patrick Mahomes 2017 50 0.0
4 Patrick Mahomes 2018 400 50.0
3 Patrick Mahomes 2019 500 400.0
2 Tom Brady 2017 400 0.0
1 Tom Brady 2018 350 400.0
0 Tom Brady 2019 300 350.0
让我们用
shift
df = df.sort_values(['Name','Year'],ascending=[True,True])
df['FantasyPtsPreviousYear'] = df['FantasyPts'].groupby(df['Name']).shift().fillna(0)
merge
将数据框与其自身合并,将1添加到年份中。这明确定义了每名球员在第1年->第1年的比赛
(注意shift
,除非您确定每年都有一行数据。如果不明确地将所有年份重新编制索引,则组内的shift
将为您提供上一年的数据,无论是1年前还是10年前(如果缺少数据))
我建议将其调整为
df['FantasyPts'].groupby(df['Name']).shift(句点=1,填充值=0)
非常感谢!同时也感谢本的建议!我能够在我的数据集上很好地工作。唯一的问题是@ALollz在下面提到的内容。我意识到这不在我最初的示例df中,但如果我在我的数据集中添加了另一行,如:df=df.append({'Name':'Tom Brady','Year':2011,'FantasyPts':450},忽略_index=True),那么Tom Brady 2017'FantasyPtsPreviousYear'列将返回为450(Brady的2011统计数据),而不是0或NaN。有办法解决这个问题吗?不管怎样,非常感谢您的帮助和及时回复。我非常感激!非常感谢!我甚至没有意识到您标记的问题(在我每年没有行的情况下使用shift),非常感谢您标记它,这样就不会让我每年都有不同的没有行的数据集。在阅读了您的评论之后,我在df中添加了另一行,如下所示:df=df.append({'Name':'Tom Brady','Year':2011,'FantasyPts':450},ignore_index=True),并意识到您的解决方案仍然有效,而shift似乎传递了您上面提到的错误。非常感谢您的回复!非常有帮助!我是否可以编辑/建议在末尾添加fillna(0)
,以完全匹配OP的输出?我还想感谢您指出了使用shift的问题,考虑它非常重要,因为它可能会破坏整个分析@CeliusStingher是的,以后可以随意编辑。不管怎样,它都会通知我,如果我不同意,我可以在编辑中解决。非常感谢您的快速和有用的回复!我能够在我的数据集上很好地工作。唯一的问题是@ALollz在下面提到的内容。我意识到这不在我最初的示例df中,但如果我在我的数据集中添加了另一行,如:df=df.append({'Name':'Tom Brady','Year':2011,'FantasyPts':450},忽略_index=True),那么Tom Brady 2017'FantasyPtsPreviousYear'列将返回为450(Brady的2011统计数据),而不是0或NaN。有办法解决这个问题吗?不管怎样,非常感谢您的帮助和及时回复。我非常感激!感谢您也回复我的答案,我建议您使用ALollz方法,因为它可以更好地解决缺少年份的问题,这种简单的解决方案可能更容易,但是,它有更多的局限性,因为它适用于从开始到结束的所有年份都在数据框架中并正确排序的情况。
df = df.merge((df.assign(Year=df['Year']+1)
.rename(columns={'FantasyPts': 'FantasyPts_prev'})),
how='left', on=['Name', 'Year'])
df['FantasyPts_prev'] = df['FantasyPts_prev'].fillna(0, downcast='infer')
Name Year FantasyPts FantasyPts_prev
0 Tom Brady 2019 300 350
1 Tom Brady 2018 350 400
2 Tom Brady 2017 400 0
3 Patrick Mahomes 2019 500 400
4 Patrick Mahomes 2018 400 50
5 Patrick Mahomes 2017 50 0