条件替换和嵌套在python中的循环

时间:2018-11-14 08:02:33

标签: python pandas for-loop if-statement

我还是python的新手,并不完全确定该方法。我有一个有关视频游戏的数据框,其中包含标题,平台,全球销量和重要发布日期。有些条目缺少发布日期。如果条目的全球销售额也非0,我想用平台的平均发布日期替换缺失的值。我不确定如何构造它,以便获取适当的均值,是否需要嵌套循环等。请告诉我是否在正确的轨道上或可以采取什么措施将其合并如果您需要任何澄清,谢谢!

    games.head()
                        Name         Platform  Global_Sales Release_Date
    0  Grand Theft Auto: San Andreas      PS2         20.81   2004-10-26
    1             Grand Theft Auto V      PS3         20.30   2013-09-17
    2             Grand Theft Auto V      PS4         18.46   2014-11-18
    3    Grand Theft Auto: Vice City      PS2         16.15   2002-10-28
    4             Grand Theft Auto V     X360         15.85   2013-09-17

    games.info()
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 28852 entries, 0 to 28851
    Data columns (total 4 columns):
    Name            28852 non-null object
    Platform        28852 non-null category
    Global_Sales    16025 non-null float64
    Release_Date    27757 non-null datetime64[ns]

    for date in games.Release_Date:
      if pd.isnull(date) and games.Global_Sales !=0:
        games.Release_Date = [mean Release_Year for appropriate Platform]

我还有另一个具有平均值的df:platform_means,取自拆分日期时间对象并找到我要使用的平均年值。

    platform_means.head()
      Platform      Release_Year  
    0      3DS       2012.282895       
    1       DC       2000.077778       
    2       DS       2007.654777       
    3       GB       1999.375000       
    4      GBA       2003.180401       

所以这将是我想要的示例,希望对您有所帮助。我可以使用Release_Date作为datetime或Release_Date,这是一个整数,具体取决于哪个更容易。我以前从未有过约会时间。

是这样的:

    games.head()
                                Name         Platform  Global_Sales Release_Date
            0             A                       PS2         20.81   2004-10-26
            1             B                       GBA         20.30   nan
            2             C                       PS4         00.00   nan
            3             D                       PS2           nan   nan
            4             E                      X360         15.85   2013-09-17

对此:

    games.head()
                                Name         Platform  Global_Sales Release_Date
            0             A                       PS2         20.81   2004-10-26
            1             B                       GBA         20.30   2003.18
            2             C                       PS4         00.00   nan
            3             D                       PS2           nan   nan
            4             E                      X360         15.85   2013-09-17

我一直在使用类似的东西,并且可以工作,但条件部分却没有。在有条件的情况下,我得到一个错误,但没有错误,我将替换所有缺少日期的行,而不是仅替换具有销售价值的行:

    for index, row in games[games['Release_Date'].isnull()].iterrows():
       if games['Global_Sales'] <= 0.01 | games['Global_Sales'].isnull():
           games.loc[games.index == index, 'Release_Date'] = 
    platform_means.loc[platform_means.Platform == row['Platform'], 
    'Release_Year'].item()

2 个答案:

答案 0 :(得分:2)

以下可能是您正在寻找的东西:

for index, row in games[games['Release_Date'].isnull()].iterrows():
    games.loc[games.index == index, 'Release_Date'] = platform_means.loc[platform_means.Platform == row['Platform'],'Release_Year'].item()

答案 1 :(得分:0)

我会尝试使用pd.where方法。参见docs

games['Release_Date'].where(games['Release_Date'].isnull(), 
                            games.join(platform_means, on='Platform')['Release_Year'])