#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