Панды: условно заменить значения на основе значений других столбцов - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть датафрейм (df), который выглядит так:

                    environment     event   
time                    
2017-04-28 13:08:22     NaN         add_rd  
2017-04-28 08:58:40     NaN         add_rd  
2017-05-03 07:59:35     test        add_env
2017-05-03 08:05:14     prod        add_env
...

Теперь моя цель - для каждого add_rd в столбце event соответствующее значение NaN в столбце environment должно быть заменено строкой RD.

                    environment     event   
time                    
2017-04-28 13:08:22     RD          add_rd  
2017-04-28 08:58:40     RD          add_rd  
2017-05-03 07:59:35     test        add_env
2017-05-03 08:05:14     prod        add_env
...

Что я до сих пор делал

Я наткнулся на df['environment'] = df['environment].fillna('RD'), который заменяет каждые NaN (это не то, что я ищу), pd.isnull(df['environment']), который обнаруживает пропущенные значения, и np.where(df['environment'], x,y), который, кажется, то, что я хочу но не работает. Кроме того, я попробовал это :

import pandas as pd

for env in df['environment']:
    if pd.isnull(env) and df['event'] == 'add_rd':
        env = 'RD'

Индексы отсутствуют или какой-то итератор для доступа к эквивалентному значению в столбце event.
И я попробовал это :

df['environment'] = np.where(pd.isnull(df['environment']), df['environment'] = 'RD', df['environment'])

SyntaxError: keyword can't be an expression

что явно не сработало.

Я посмотрел на несколько вопросов, но не смог основываться на предложениях в ответах. вопрос черных вопрос Саймона вопрос szli вопрос Яна Виллемса Тулпа

Итак, как мне заменить значение в столбце на значения других столбцов?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

если вы хотите заменить просто 'add_rd' на 'RD', это может быть полезно для вас

keys_to_replace = {'add_rd':'RD','add_env':'simple'}
df['environment'] = df.groupby(['event'])['environment'].fillna(keys_to_replace['add_rd'])
df

выход:

    environment event
0   RD          add_rd
1   RD          add_rd
2   test        add_env
3   prod        add_env

если у вас есть много значений для замены в зависимости от события, вам, возможно, придется следовать за groupby значениями столбца 'event'

keys_to_replace = {'add_rd':'RD','add_env':'simple'}
temp = df.groupby(['event']).apply(lambda x:  x['environment'].fillna(keys_to_replace[x['event'].values[0]]))
temp.index = temp.index.droplevel(0)
df['environment'] = temp.sort_index().values

выход: * +1010 *

   environment  event
0   RD          add_rd
1   RD          add_rd
2   test        add_env
3   prod        add_env
0 голосов
/ 07 сентября 2018

Теперь моя цель - для каждого add_rd в столбце события, связанного с Значение NaN в столбце среды должно быть заменено строкой RD.

Согласно комментарию @ Zero, используйте pd.DataFrame.loc и логическое индексирование:

df.loc[df['event'].eq('add_rd') & df['environment'].isnull(), 'environment'] = 'RD'
0 голосов
/ 07 сентября 2018

Вы можете использовать where:

df.environment.where((~df.environment.isnull()) & (df.event != 'add_rd'),
                     'RD', inplace=True)

Если условие не выполняется, значения заменяются вторым элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...