Удаление «неисправных» строк фрейма данных pandas на основе их типа и значения

#python #pandas

#python #pandas

Вопрос:

У меня есть набор данных, который включает столбец значений даты и времени и другой столбец, содержащий некоторые измеренные значения (с плавающей точкой). Однако во время некоторых измерений произошла ошибка, в результате чего появились некоторые странные записи — пример ниже (к ним относятся повторяющаяся часть объекта datetime, которая интерпретируется как строка, неполный объект datetime, полностью случайная строка, пропущенное значение или значение для другого столбца, которое выходит за пределы диапазона (измеренные значения в основном составляют от 10 до 50, но иногда я получаю ноль или значение, подобное 100).

извлечение из большого набора данных (загружается как фрейм данных pandas):

                                       t                          baaa
0                      13/11/2014 23:43                          17.6
1                      13/11/2014 23:44                          17.7
2   2014-11-13 23:452014-11-13 23:45:00                          17.7
3                      13/11/2014 23:46                          17.7
4                      14/11/2014 00:34                            16
5                      14/11/2014 00:35                          15.9
6                                   :00                          17.7
7                      14/11/2014 01:25                          14.9
8                      14/11/2014 01:26                          14.9
9                                     0                            80
10                     14/11/2014 02:16                          14.3
11                     14/11/2014 02:17                          14.3
12                                  NaN  AA550112209500080009002855AA
13                     14/11/2014 03:09                            13
14                      009000B002B55AA                           NaN
15                     14/11/2014 02:19                          14.3
16                     14/11/2014 03:59                          12.6
17                     14/11/2014 04:00                          12.6
18                     14/11/2014 05:41                          11.7
19                     14/11/2014 05:42                          11.7
20                                    0                           140
21                     14/11/2014 04:53                          12.2
  

примеры всех типов ошибочных записей здесь.
Как я могу избавиться от неисправных строк?
Моя идея состояла в том, чтобы выполнить цикл if, установив условие, что столбец ‘t’ должен быть объектом datetime, а столбцы ‘baaa’ должны быть с плавающей точкой> 0 и <60. Если условие не выполнено, я бы заменил значение на np.nan и в конечном итоге использовал dropna функцию.

 df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce')
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce')    
for line in df.iloc[:,1]:  
    if (line < 60) amp; (line > 0):
       line = line
   else:
       line = np.nan
    # not assigning this new value! :( 

    df = df.dropna(subset = df.columns.values, how='any', inplace=True)
  

Похоже, это решило большинство проблем, за исключением условия, что строка должна быть меньше 60.
У меня, должно быть, неправильный синтаксис? Или что здесь не так?
Спасибо!

Ответ №1:

Я думаю, что вам нужно boolean indexing для фильтрации, вместо dropna этого вы можете добавить новое (третье) условие с notnull помощью — получить все NaN значения not в столбце t . NaN значения в первом столбце фильтруются по первому и второму условию:

 df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce')
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce')  
df = df[(df.iloc[:,1] < 60) amp; (df.iloc[:,1] > 0) amp; (df['t'].notnull())]

print (df)
                     t  baaa
0  2014-11-13 23:43:00  17.6
1  2014-11-13 23:44:00  17.7
3  2014-11-13 23:46:00  17.7
4  2014-11-14 00:34:00  16.0
5  2014-11-14 00:35:00  15.9
7  2014-11-14 01:25:00  14.9
8  2014-11-14 01:26:00  14.9
10 2014-11-14 02:16:00  14.3
11 2014-11-14 02:17:00  14.3
13 2014-11-14 03:09:00  13.0
15 2014-11-14 02:19:00  14.3
16 2014-11-14 03:59:00  12.6
17 2014-11-14 04:00:00  12.6
18 2014-11-14 05:41:00  11.7
19 2014-11-14 05:42:00  11.7
21 2014-11-14 04:53:00  12.2