熊猫:根据其他列的值有条件地替换值

时间:2018-09-07 14:02:05

标签: python python-3.x pandas dataframe

我有一个数据帧(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值替换为字符串{{1} }。

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,它正在检测缺失值,而{{ 1}}似乎是我想要的但没有用。 我还尝试了此

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'

显然没有用。

我看了几个问题,但不能以答案中的建议为基础。 Black's question Simon's question szli's question Jan Willems Tulp's question

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

4 个答案:

答案 0 :(得分:2)

您可以考虑使用where

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

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

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:0)

如果您只想将'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之后加上“事件”列值

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

答案 3 :(得分:0)

这里是:

 df['environment']=df['environment'].fillna('RD')