Условная замена и вложенность для циклов в python - PullRequest
0 голосов
/ 14 ноября 2018

Я все еще новичок в python и не совсем уверен, как подойти к этому. У меня есть дата-фрейм о видеоиграх с названием, платформой, глобальными продажами и важными датами выпуска. Есть некоторые записи, где дата выпуска отсутствует. Я хотел бы заменить отсутствующее значение средней датой выпуска по платформе, если запись также имеет ненулевое значение глобальных продаж. Я не совсем уверен, как структурировать это так, чтобы оно вытягивало соответствующие средние значения, нужен ли мне вложенный цикл и т. Д. Пожалуйста, дайте мне знать, если я на правильном пути или что я могу сделать, чтобы включить это и если вам нужны какие-либо разъяснения, спасибо!

    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, взятый из разбиения моего объекта datetime и поиска среднего значения года, которое я хочу использовать.

    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, который является int, в зависимости от того, что проще. У меня просто никогда не было свиданий.

примерно так:

    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 голосов
/ 19 ноября 2018

Я бы попробовал использовать метод pd.where. См. документы .

games['Release_Date'].where(games['Release_Date'].isnull(), 
                            games.join(platform_means, on='Platform')['Release_Year'])
0 голосов
/ 14 ноября 2018

может быть то, что вы ищете:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...