2017-01-06 3 views
1

Я экспериментирую с методом fillna(). Я создал небольшой dataframe и две серии для этой цели:Метод fiilna() на Pandas игнорирует аргумент inplace возвращает ошибку при вызове по оси = 1

col1 col2 col3  col4 
0 NaN  NaN 3   4 
1 NaN  NaN 7   8 
2 9.0  10.0 11   12 

n1 = pd.Series([10, 20]) 
n2 = pd.Series([30, 40, 50, 60]) 
n2.index = list(df.columns.values) 

Когда я пытаюсь команду:

df.fillna(n1, axis=0, inplace = True) 

Ничего не происходит, NaNs остаются нетронутыми. Я бы ожидал увидеть их замененными значениями 10 (col1) и 20 (col2). Когда я пытаюсь

df.fillna(n2, axis =1) 

Я получаю сообщение об ошибке:

NotImplementedError: Currently only can fill with dict/Series column by column 

Не могли бы вы объяснить это поведение? Ваш совет будет оценен по достоинству.

ответ

0

Вы хотите указать столбец, для которого вы заполните значения. Например,

df['col1'].fillna(n1, inplace=True) 

df 
Out[17]: 
    col1 col2 col3 col4 
0 10 NaN  3  4 
1 20 NaN  7  8 
2  9 10 11 12 

В том случае, что вы заполняете в одном значении, а не, скажем, 0, вы можете применить его к DataFrame, как вы делали выше. Начиная с оригинальным DataFrame,

df.fillna(0, inplace=True) 

df 
Out[27]: 
    col1 col2 col3 col4 
0  0  0  3  4 
1  0  0  7  8 
2  9 10 11 12 
2

ось по умолчанию для fillna является 0. Это приводит к сопоставлению столбцов с индексом проходящей серии. Это означает, что заливая n2 должен быть на axis=0

df.fillna(n2) # axis=0 is default 

    col1 col2 col3 col4 
0 30.0 40.0  3  4 
1 30.0 40.0  7  8 
2 9.0 10.0 11 12 

Выполнение этого inplace=True определенно работает

df.fillna(n2, inplace=True) 
print(df) 

    col1 col2 col3 col4 
0 30.0 40.0  3  4 
1 30.0 40.0  7  8 
2 9.0 10.0 11 12 

df.fillna(n1, axis=1) 

NotImplementedError: Currently only can fill with dict/Series column by column 

Yeah! Вы не повез ... вроде

варианта 1
transpose()

df.T.fillna(n1).T 

    col1 col2 col3 col4 
0 10.0 10.0 3.0 4.0 
1 20.0 20.0 7.0 8.0 
2 9.0 10.0 11.0 12.0 

варианта 2
использование неудобно pandas передающей

n1_ = pd.DataFrame([n1], index=df.columns).T 
df.fillna(n1_) 

или inplace

df.fillna(n1_, inplace=True) 
df 

    col1 col2 col3 col4 
0 10.0 10.0  3  4 
1 20.0 20.0  7  8 
2 9.0 10.0 11 12 

 Смежные вопросы

  • Нет связанных вопросов^_^