Pandas:基于其他列值有条件地替换值

2024-05-21 03:47:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧(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
...

现在我的目标是,对于event列中的每个add_rd,应该用字符串RD替换NaN列中关联的NaN值。

                    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 questionSimon's questionszli's questionJan Willems Tulp's question

那么,如何基于其他列值替换列中的值?


Tags: testenveventadddfenvironmenttimenp
3条回答

Now my goal is for each add_rd in the event column, the associated NaN-value in the environment column should be replaced with a string RD.

根据@Zero的注释,使用^{}和布尔索引:

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

如果您只想用“rd”替换“add\u 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

您可以考虑使用^{}

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

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

相关问题 更多 >