Выборочная замена NaN с использованием значений столбца - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть фрейм данных:

   GType   BNM  XXCV  COO
0  CAT1  WERT   NaN  NaN
1  CAT3  FRGT   NaN  NaN
2  CAT3   NaN   NaN  NaN
3  CAT2   NaN   NaN  NaN

Мне нужно выборочно заменить NaN s пробелом или текстом "vvv", используя GType.

У меня естьследующий фрагмент кода:

list1 = ['CAT1','CAT2']
mask = (df.COO.isnull()|df.BNM.isnull()|df.XXCV.isnull()) & (df.GType.isin(list1))
df.loc[mask, ('COO',  'BNM', 'XXCV')] = df.loc[mask, ('COO', 'XXCV', 'BNM'].replace('NaN', '')

list12 = ['CAT3']
mask12 =df.COO.isnull()|df.BNM.isnull())& (df.GType.isin(list12))
df.loc[mask12, ('COO',  'BNM')] = df.loc[mask12, ('COO', 'BNM')].replace('NaN', '')

Он запускает и изменяет элементы GType в list1 и оставляет их в list12.На данный момент я получаю:

   GType   BNM XXCV  COO
0  CAT1  WERT          
1  CAT3  FRGT  NaN  NaN
2  CAT3   NaN  NaN  NaN
3  CAT2   NaN

Мой желаемый результат будет:

   GType   BNM XXCV  COO
0  CAT1  WERT          
1  CAT3  FRGT  NaN  
2  CAT3         NaN 
3  CAT2   

Где я ошибаюсь?

1 Ответ

0 голосов
/ 15 февраля 2019

это должно сработать

import pandas as pd

df = pd.DataFrame({
    'GType': ['CAT1', 'CAT3', 'CAT3', 'CAT2'],
    'BNM': ['WERT', 'FRGT', None, None],
    'XXCV': [None, None, None, None],
    'COO': [None, None, None, None],
})

to_nan_xxcv = (df.XXCV.isnull()) & (df.GType.isin(['CAT1', 'CAT2']))
to_nan_rest = (df.COO.isnull() | df.BNM.isnull())
df.loc[to_nan_xxcv, 'XXCV'] = df.loc[to_nan_xxcv, 'XXCV'].fillna('')
df.loc[to_nan_rest, ('COO', 'BNM')] = df.loc[to_nan_rest, ('COO', 'BNM')].fillna('')
print(df)

to_nan_xxcv отфильтрует только то, что вы хотите, а остальное заменит независимо на GType, что, очевидно, то, что вы хотели, исходя из желаемого результата,Также вы можете заменить на vvv, позвонив .fillna('vvv')

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