Очистка неправильных возможных значений в датафрейме - PullRequest
1 голос
/ 15 января 2020

Я работаю над набором данных, заполненным некоторыми ошибками.

В этом наборе данных есть много плохих значений, таких как 0xFFFF, которые я хотел бы очистить. Какой самый эффективный способ очистить этот набор данных и получить некоторые согласованные значения?

Я пробовал df = df.apply(lambda x: pd.to_numeric(x,errors = 'coerce')), но есть еще одна проблема, например, в январе 31 день, в феврале там 28, поэтому строка за 29/30/31 февраля уже заполнена 'NaN'.

Моя цель здесь - проверить, не является ли строка числом (например, 0XFFFF), и изменить это значение на что-то связное. (например, среднее значение из 2 последних значений и 2 следующих значений)

Очистить данные:

    January  February   March  April  May           june  July  August
0        -5     -7.0      -7    2.0   12             17      20    20   
1        -6     -6.0      -8    3.0   14              16      20    19   
2        -5     -5.0      -5    4.0   15              17      17    19   
3        -3     -6.0      -3    6.0   16              14      18    18   
4        -6     -8.0      -2    4.0   13              15      17    17   
5       -11     -9.0       1    5.0   12              17      17    18   
6        -6      5.0       2    4.0    8              17      16    16   
7        -8    -11.0       1    6.0    7              15      17    17   
8       -11    -12.0       1    7.0    6              14      17    15   
9        -8     -9.0       2    7.0    5             Sun      15    14   
10       -8     -6.0       1    8.0    5              14      15    14   
11       -8     -5.0       3    8.0    6              13      16    15   
12       -8     -4.0       5    9.0    8              11      16    15   
13      -10      1.0       5   10.0   10              14      13    15   
14      -10      3.0       7    8.0   12              15      14    48   
15       -9     -9.0  0xFFFF    8.0   13              15      -6    18   
16       -6     -6.0       2    9.0   14              15      15    19   
17       -6     -6.0      -1   11.0   13              17      15    21   
18       -4     -4.0      -2   10.0   15              16      15    24   
19       -8      2.0      -1   11.0   15              19      17    21   
20       -9      3.0       0   12.0   15              20      18    21   
21      -14      1.0       1    9.0   18              19      19    26   
22      -15     -3.0       2    7.0   18              20  0xFFFF    17   
23      -17     -4.0       3    8.0   16              22      24    18   
24      -19     -6.0       4    8.0   15              22      23    17   
25      -23     -8.0       3    6.0   16              21      26    17   
26       -8     -8.0       4    9.0   16              22      26    16   
27       -9    -11.0       5   11.0   17              21      21    17   
28       -5      NaN       5   14.0   16              21      22    17   
29       -6      NaN       3   16.0   17              17      23    18   
30       -7      NaN       3    NaN   17             NaN      21    17   

Ожидаемый выходной сигнал после работы (NaN должен остаться, но все остальные должны измениться (не числовые значения)):

     January  February   March  April  May           june  July  August  \
0        -5     -7.0      -7    2.0   12              17      20    20   
1        -6     -6.0      -8    3.0   14              16      20    19   
2        -5     -5.0      -5    4.0   15              17      17    19   
3        -3     -6.0      -3    6.0   16              14      18    18   
4        -6     -8.0      -2    4.0   13              15      17    17   
5       -11     -9.0       1    5.0   12              17      17    18   
6        -6      5.0       2    4.0    8              17      16    16   
7        -8    -11.0       1    6.0    7              15      17    17   
8       -11    -12.0       1    7.0    6              14      17    15   
9        -8     -9.0       2    7.0    5              14      15    14   
10       -8     -6.0       1    8.0    5              14      15    14   
11       -8     -5.0       3    8.0    6              13      16    15   
12       -8     -4.0       5    9.0    8              11      16    15   
13      -10      1.0       5   10.0   10              14      13    15   
14      -10      3.0       7    8.0   12              15      14    48   
15       -9     -9.0      4.5   8.0   13              15      -6    18   
16       -6     -6.0       2    9.0   14              15      15    19   
17       -6     -6.0      -1   11.0   13              17      15    21   
18       -4     -4.0      -2   10.0   15              16      15    24   
19       -8      2.0      -1   11.0   15              19      17    21   
20       -9      3.0       0   12.0   15              20      18    21   
21      -14      1.0       1    9.0   18              19      19    26   
22      -15     -3.0       2    7.0   18              20      19    17   
23      -17     -4.0       3    8.0   16              22      24    18   
24      -19     -6.0       4    8.0   15              22      23    17   
25      -23     -8.0       3    6.0   16              21      26    17   
26       -8     -8.0       4    9.0   16              22      26    16   
27       -9    -11.0       5   11.0   17              21      21    17   
28       -5      NaN       5   14.0   16              21      22    17   
29       -6      NaN       3   16.0   17              17      23    18   
30       -7      NaN       3    NaN   17             NaN      21    17  

Спасибо!

1 Ответ

2 голосов
/ 15 января 2020

Используйте DataFrame.apply с pd.to_numeric:

df = df.apply(lambda x: pd.to_numeric(x,errors = 'coerce'))

Если вы хотите сохранить столбцы str, вы можете выбрать столбцы для очистки:

cols = [my_list of columns]
df[cols] = df[cols].apply(lambda x: pd.to_numeric(x,errors = 'coerce'))

Мы также можем использовать DataFrame.stack + DataFrame.unstack

df = pd.to_numeric(df.stack(),errors='coerce').unstack() 

Выход

  january   february
0      -1       -1.0
1      -3       -2.0
2      -5        NaN
3       1        1.0
4       0        0.0
5      -6        6.0
6      -7        4.0
7      -5        2.0

ОБНОВЛЕНИЕ

df = ( pd.to_numeric(df.stack(),errors='coerce')
         .unstack().interpolate().where(df.notna()) )


    January  February  March  April   May  june  July  August
0      -5.0      -7.0   -7.0    2.0  12.0  17.0  20.0    20.0
1      -6.0      -6.0   -8.0    3.0  14.0  16.0  20.0    19.0
2      -5.0      -5.0   -5.0    4.0  15.0  17.0  17.0    19.0
3      -3.0      -6.0   -3.0    6.0  16.0  14.0  18.0    18.0
4      -6.0      -8.0   -2.0    4.0  13.0  15.0  17.0    17.0
5     -11.0      -9.0    1.0    5.0  12.0  17.0  17.0    18.0
6      -6.0       5.0    2.0    4.0   8.0  17.0  16.0    16.0
7      -8.0     -11.0    1.0    6.0   7.0  15.0  17.0    17.0
8     -11.0     -12.0    1.0    7.0   6.0  14.0  17.0    15.0
9      -8.0      -9.0    2.0    7.0   5.0  14.0  15.0    14.0
10     -8.0      -6.0    1.0    8.0   5.0  14.0  15.0    14.0
11     -8.0      -5.0    3.0    8.0   6.0  13.0  16.0    15.0
12     -8.0      -4.0    5.0    9.0   8.0  11.0  16.0    15.0
13    -10.0       1.0    5.0   10.0  10.0  14.0  13.0    15.0
14    -10.0       3.0    7.0    8.0  12.0  15.0  14.0    48.0
15     -9.0      -9.0    4.5    8.0  13.0  15.0  -6.0    18.0
16     -6.0      -6.0    2.0    9.0  14.0  15.0  15.0    19.0
17     -6.0      -6.0   -1.0   11.0  13.0  17.0  15.0    21.0
18     -4.0      -4.0   -2.0   10.0  15.0  16.0  15.0    24.0
19     -8.0       2.0   -1.0   11.0  15.0  19.0  17.0    21.0
20     -9.0       3.0    0.0   12.0  15.0  20.0  18.0    21.0
21    -14.0       1.0    1.0    9.0  18.0  19.0  19.0    26.0
22    -15.0      -3.0    2.0    7.0  18.0  20.0  21.5    17.0
23    -17.0      -4.0    3.0    8.0  16.0  22.0  24.0    18.0
24    -19.0      -6.0    4.0    8.0  15.0  22.0  23.0    17.0
25    -23.0      -8.0    3.0    6.0  16.0  21.0  26.0    17.0
26     -8.0      -8.0    4.0    9.0  16.0  22.0  26.0    16.0
27     -9.0     -11.0    5.0   11.0  17.0  21.0  21.0    17.0
28     -5.0       NaN    5.0   14.0  16.0  21.0  22.0    17.0
29     -6.0       NaN    3.0   16.0  17.0  17.0  23.0    18.0
30     -7.0       NaN    3.0    NaN  17.0   NaN  21.0    17.0
...