Заменить определенные строки с NaN в пандах - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть DF панд, в которой мне нужно перебрать значения из двух столбцов (местоположение и событие) и заменить строки «Gate-3» «NO Access» на NaN.

ниже приведен пример DF.

Time        Location    Event               Badge ID
18:28:59    Gate-2      Access Granted      81002
18:28:12    Gate-1      Access Granted      80557
18:27:55    Gate-3      Access Granted      80557
18:27:44    Gate-3      NO Access           80398
18:25:38    Gate-1      NO Access           80978
18:25:30    Gate-2      Access Granted      73680
18:23:56    Gate-1      Access Granted      73680
18:23:52    Gate-2      Access Granted      80557
18:23:19    Gate-2      NO Access           128
18:23:16    Gate-1      Access Granted      80557

Ожидаемый результат:

       Time Location           Event  Badge ID
0  18:28:59   Gate-2  Access Granted     81002
1  18:28:12   Gate-1  Access Granted     80557
2  18:27:55      NaN  Access Granted     80557
3  18:27:44      NaN             NaN     80398
4  18:25:38   Gate-1             NaN     80978
5  18:25:30   Gate-2  Access Granted     73680
6  18:23:56   Gate-1  Access Granted     73680
7  18:23:52   Gate-2  Access Granted     80557
8  18:23:19   Gate-2             NaN       128
9  18:23:16   Gate-1  Access Granted     80557

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

Итерация не обязательна для установки значения столбца на основе условия.Вместо этого вы должны использовать логическое индексирование.

Пример:

data = {'Time':['18:28:59', '18:28:59', '18:28:59'], 
     'Location':['Gate-2', 'Gate-3', 'Gate-1', ], 
     'Event':['Access Granted', 'NO Access', 'NO Access'], 
     'BadgeID':[81002, 80557, 80557]}

df = pd.DataFrame(data)

    Time       Location     Event         BadgeID
0   18:28:59   Gate-2     Access Granted  81002
1   18:28:59   Gate-3     NO Access       80557
2   18:28:59   Gate-1     NO Access       80557

Метод 'loc' - это индексатор на основе меток, который принимает логический массив, а также другиеoptions.

Условное выражение:

df.Location == 'Gate-3'

возвращает логический массив или Series

0    False
1    True
2    False
Name: Location, dtype: bool

Это можно проверить с помощью встроенной функции type ()

type(df.Location == 'Gate-3')
# pandas.core.series.Series

Эта серия используется в качестве индекса строки для исходного метода loc DataFrame.

Метод loc использует индексатор строк и индексатор столбцов.Таким образом, приведенный ниже оператор

df.loc[df.Location == 'Gate-3', 'Location'] = np.nan

преобразуется в:

Установите пересечение строк, в которых Location равен Gate-3, а столбец Location - нулевое значение

0 голосов
/ 14 декабря 2018

Вы можете настроить это при загрузке файла XLS, указав параметр na_values.

df = pd.read_excel('file.xls', na_values=['Gate-3', 'NO Access'])
print(df)

       Time Location           Event  Badge ID
0  18:28:59   Gate-2  Access Granted     81002
1  18:28:12   Gate-1  Access Granted     80557
2  18:27:55      NaN  Access Granted     80557
3  18:27:44      NaN             NaN     80398
4  18:25:38   Gate-1             NaN     80978
5  18:25:30   Gate-2  Access Granted     73680
6  18:23:56   Gate-1  Access Granted     73680
7  18:23:52   Gate-2  Access Granted     80557
8  18:23:19   Gate-2             NaN       128
9  18:23:16   Gate-1  Access Granted     80557

Это, IMO, лучше, чем очистка данных после загрузка в.

0 голосов
/ 14 декабря 2018

Вы можете получить логическую маску, где ваши условия выполняются, с помощью

mask = df.Location.eq('Gate-3') & df.Event.eq('NO Access') # df is your dataframe

Вы можете использовать эту маску для установки любых столбцов, которые вы хотите NaN, например:

df.loc[mask, ['Location', 'Event']] = np.nan # imported numpy as np                                                                         

edit:

Кажется, вы изменили спецификации.Если вы хотите установить NaN, где столбец «Местоположение» или «Событие» соответствует вашим дозорным значениям, используйте две маски.

locmask = df.Location.eq('Gate-3')                                                                                     
df.loc[locmask, 'Location'] = np.nan                                                                                   
evmask = df.Event.eq('NO Access')                                                                                      
df.loc[evmask, 'Event'] = np.nan
0 голосов
/ 14 декабря 2018

Если я не правильно понял ваш вопрос , то как насчет этого?

import pandas as pd
import numpy as np
df.loc[df.Location == 'Gate-3', 'Location'] = np.nan
df.loc[df.Event == 'NO Access', 'Event'] = np.nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...