Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Pandas使用两列作为VLOOKUP的索引来执行条件VLOOKUP?_Python_Pandas_Dataframe_Vlookup - Fatal编程技术网

Python 如何使用Pandas使用两列作为VLOOKUP的索引来执行条件VLOOKUP?

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

我对Pandas和Python非常陌生,我根本不知道如何在Excel中轻松完成一些事情。我希望能从社区得到一些帮助

假设我有以下内容,这是一个与幻想足球有关的df,有三列-‘名称’、‘年份’和‘幻想王国’。代码如下

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中很难弄清楚如何做到这一点

我想做的是:

  • 对于表中的每一行,让python/pandas检查df中该行的名称和年份
  • 查找同一玩家在上一年(即第1年)所获得的幻想分数
  • 在名为“FantasyPtsPreviousYear”的df新行中填充该数字,或者,如果没有该玩家上一年的数据,则输入0
  • 在Excel中,我只需创建新列,并将这些列与VLOOKUPs一起使用。我在Pandas中找到的最接近VLOOKUP的东西是合并,但在这里似乎不起作用(或者至少我不知道如何使它与这个特定的应用程序一起工作)。在试图找到答案之后,我认为它可能与loc()函数和For循环有关,但我无法让它工作


    谢谢你能提供的任何帮助!我非常感谢它,并认为这个社区为它提供的所有帮助是令人敬畏的

    我相信这可以通过结合
    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