2016-08-15 2 views
2

Я хочу совместить вменение влечения Склеарна и Ffill Panda, чтобы заполнить отсутствующие данные. Это то, что мой dataFrame, df выглядитPandas Ffill на строках, которые содержат только NaN

FeatA FeatB FeatC FeatD 
    B  A  B  D 
NaN NaN NaN NaN 
    A  A  B  C 
NaN  A  A  A 
NaN  B  A  A 

Я хочу использовать Ffill для заполнения строки, которые содержат только NaN (например строка 2), с предыдущим значением.

Если строки содержат только несколько NaN, например, если имеется не менее 1 значения, используйте вменение, чтобы заполнить NaN самым частым значением в строке.

Я использую LabelEncoder для преобразования значений String в целые числа - это в алфавитном порядке. A=0, B=1, C=2, D = 3. Для того, чтобы убедиться, что NaN получить значение 4, преобразовать NaN в «Z» - с помощью data = df.fillna("Z")

Я тогда приписывать данные так, что любое значение с Z заполняется наиболее часто встречающееся значение в ряду - imp = Imputer(missing_values=4, strategy= 'most_frequent', axis=1)

Итак, я хочу заполнить строки, которые имеют только NaN, используя ffill.

Затем я использую LabelEncoder и вменение, чтобы заполнить другие NaN наиболее частое значение в строке.

Если я могу выбрать строки, которые содержат только NaN, и примените функцию ffill только к этим строкам, тогда я могу использовать вменение в другом Нань. Как я могу это сделать?

+0

'df. fillna (метод = 'ffill', inplace = True) '. Это будет распространять последнее действительное наблюдение вперед и соответственно изменять значения «Нан». –

+0

«Итак, я хочу заполнить строки, которые имеют только NaN, используя ffill». Это сделало бы строку такой же, как в приведенной выше строке. Почему бы вам просто не удалить эту строку? – ayhan

+0

Это для ввода в классификационную модель - я не хочу удалять пустые строки – gbhrea

ответ

0

Вы можете первым дублировать Nan только строки с его предыдущего значения и по-прежнему, как показано:

## Select rows containing all Nan values and replace them with the preceding values 
In [2]: df.loc[df.isnull().all(axis=1), :] = df.ffill()  

In [3]: df.fillna('Z', inplace=True) 

Initialize LabelEncoder и выполнять fit:

In [4]: enc = LabelEncoder() 

In [5]: enc.fit(np.unique(df.values)) 
Out[5]: LabelEncoder() 

In [6]: df = df.apply(enc.transform) 

вменить отсутствующие значения с наиболее частыми элементами вдоль столбцы:

In [7]: imp = Imputer(missing_values=4, strategy='most_frequent', axis=1) 

In [8]: imp.fit_transform(df) 
Out[8]: 
array([[ 1., 0., 1., 3.], 
     [ 1., 0., 1., 3.], 
     [ 0., 0., 1., 2.], 
     [ 0., 0., 0., 0.], 
     [ 0., 1., 0., 0.]])