Очистка данных Python: замена значений столбца вне диапазона на NaN, а затем отбрасывание необработанных данных, содержащих NaN - PullRequest
0 голосов
/ 17 июня 2019

Я занимаюсь исследованиями и мне нужно удалить исходные коды, содержащие некоторые значения, которые не входят в определенный диапазон, используя Python.

Мой набор данных в Excel:

enter image description here

  1. Я хочу заменить большие значения столбца A (не в диапазоне 1-20) на NaN. Замените большие значения столбца B (не в диапазоне 21-40) и т. Д.
  2. Теперь я хочу удалить / удалить исходные данные, содержащие значения NaN

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

enter image description here

Ответы [ 2 ]

1 голос
/ 17 июня 2019

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

import numpy as np
import pandas as pd


data = pd.read_csv('c.csv')
print(data)
data['A'] = data['A'].apply(lambda x: np.nan if x in range(1,10,1) else x)
data['B'] = data['B'].apply(lambda x: np.nan if x in range(10,20,1) else x)
data['C'] = data['C'].apply(lambda x: np.nan if x in range(20,30,1) else x)
print(data)
data = data.dropna()
print(data)

Исходные данные:

    A   B   C
0   1  10  20
1   2  11  22
2   4  15  25
3   8  20  30
4  12  25  35
5  18  40  55
6  20  45  60

Вывод с NaN:

      A     B     C
0   NaN   NaN   NaN
1   NaN   NaN   NaN
2   NaN   NaN   NaN
3   NaN  20.0  30.0
4  12.0  25.0  35.0
5  18.0  40.0  55.0
6  20.0  45.0  60.0

Окончательный вывод:

      A     B     C
4  12.0  25.0  35.0
5  18.0  40.0  55.0
6  20.0  45.0  60.0

Попробуйте это для нецелых чисел:

import numpy as np
import pandas as pd


data = pd.read_csv('c.csv')
print(data)
data['A'] = data['A'].apply(lambda x: np.nan if x in (round(y,2) for y in np.arange(1.00,10.00,0.01)) else x)
data['B'] = data['B'].apply(lambda x: np.nan if x in (round(y,2) for y in np.arange(10.00,20.00,0.01)) else x)
data['C'] = data['C'].apply(lambda x: np.nan if x in (round(y,2) for y in np.arange(20.00,30.00,0.01)) else x)
print(data)
data = data.dropna()
print(data)

Выход:

       A      B      C
0   1.25  10.56  20.11
1   2.39  11.19  22.92
2   4.00  15.65  25.27
3   8.89  20.31  30.15
4  12.15  25.91  35.64
5  18.29  40.15  55.98
6  20.46  45.00  60.48
       A      B      C
0    NaN    NaN    NaN
1    NaN    NaN    NaN
2    NaN    NaN    NaN
3    NaN  20.31  30.15
4  12.15  25.91  35.64
5  18.29  40.15  55.98
6  20.46  45.00  60.48
       A      B      C
4  12.15  25.91  35.64
5  18.29  40.15  55.98
6  20.46  45.00  60.48
0 голосов
/ 17 июня 2019

попробуйте это,

df= df.drop(df.index[df.idxmax()])

O / P:

    A   B   C   D
0    1  21  41  61
1    2  22  42  62
2    3  23  43  63
3    4  24  44  64
4    5  25  45  65
5    6  26  46  66
6    7  27  47  67
7    8  28  48  68
8    9  29  49  69
13  14  34  54  74
14  15  35  55  75
15  16  36  56  76
16  17  37  57  77
17  18  38  58  78
18  19  39  59  79
19  20  40  60  80

используйте idxmax и отбросьте возвращенный индекс.

...