Pandas:根据其他列值有条件地替换值

问题描述 投票:3回答:3

我有一个如下所示的数据帧(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列中的每个eventNaN列中的相关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

这显然没有用。

我看了几个问题,但无法在答案中提出建议。 Black's question Simon's question szli's question Jan Willems Tulp's question

那么,如何根据其他列值替换列中的值?

python python-3.x pandas dataframe
3个回答
2
投票

现在我的目标是为事件列中的每个add_rd,环境列中的相关NaN值应替换为字符串RD。

根据@ Zero的评论,使用pd.DataFrame.loc和布尔索引:

df.loc[df['event'].eq('add_rd') & df['environment'].isnull(), 'environment'] = 'RD'

2
投票

你可以考虑使用where

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

如果不满足条件,则值将替换为第二个元素。


0
投票

如果你想用'RD'替换'add_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

如果您有许多要根据事件替换的值,那么您可能需要使用'event'列值跟随groupby

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

输出:

   environment  event
0   RD          add_rd
1   RD          add_rd
2   test        add_env
3   prod        add_env
© www.soinside.com 2019 - 2024. All rights reserved.