web-dev-qa-db-ja.com

パンダ:他の列の値に基づいて値を条件付きで置換する

次のようなデータフレーム(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_です。NaN列の関連するenvironment- valueは、文字列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
...
_

これまでに行ったこと

everyNaN(これは私が探しているものではありません)を置き換えるdf['environment'] = df['environment].fillna('RD')に出会いました、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の質問Jan Willems Tulpの質問

では、別の列の値に基づいて列の値を置き換えるにはどうすればよいですか?

5
Martin Müsli

ここでの目標は、イベント列の各add_rdです。環境列の関連するNaN値は、文字列RDで置き換える必要があります。

@Zeroのコメントに従って、 pd.DataFrame.loc およびブールインデックス:

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

where の使用を検討できます。

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

条件が満たされない場合、値は2番目の要素に置き換えられます。

3
CT Zhu

「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

出力:

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

ここにあります:

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