2017-01-18 3 views
1

У меня есть DataFrame (довольно большой, трудно воспроизвести & с), для которых я наблюдаю такое поведение:Панды "fillna" игнорирует "InPlace = True" ключевое слово

>>> df.info(verbose=True,memory_usage=True,null_counts=True) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 49841 entries, 0 to 49878 
Data columns (total 70 columns): 
... 
channel        25101 non-null object 
... 
dtypes: bool(10), datetime64[ns](6), float64(2), int64(32), object(20) 
memory usage: 23.7+ MB 
>>> df.channel.fillna("Unknown",inplace=True) 
>>> df.info(verbose=True,memory_usage=True,null_counts=True) 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 49841 entries, 0 to 49878 
Data columns (total 70 columns): 
... 
channel        25101 non-null object 
... 
dtypes: bool(10), datetime64[ns](6), float64(2), int64(32), object(20) 
memory usage: 23.7+ MB 

IOW, оказывается, что df.channel.fillna("Unknown",inplace=True) не имеет никакого эффекта.

Как это может быть? Это ошибка? Что я делаю неправильно ?!

PS. Резюме от комментариев:

  • df.is_copy является None
  • df._is_view является False
  • channel столбец, а не атрибут, потому что он внесен в список info
+0

что делает 'ДФ [! Df.channel = df.channel.fillna ('Неизвестные')]' возвращается? – Boud

+1

Я подозреваю, что он ничего не заменяет, так как код замещения, который вы пишете, должен работать, если вы df еще не вид – Boud

+1

"inplace: boolean, по умолчанию False Если True, заполните. Примечание: это изменит любые другие виды на этом объекте (например, фрагмент без копии для столбца в DataFrame). ". Будет ли это ядром проблемы? –

ответ

1

От documentation:

Вы можете использовать доступ к атрибуту для изменения существующего элемента серии или столбца DataFrame, но будьте осторожны; если вы попытаетесь использовать атрибут для создания нового столбца, он терпит неудачу, создавая новый атрибут , а не новый столбец.

Мы подозреваем, вы назначили df.channel первым, затем df['channel'] и это создает неожиданное поведение.

+0

, если 'channel' был атрибутом, он не был бы указан в столбце' df.info'. – sds

+0

Я говорю, что вы оба сделали – Boud

+0

Хорошо, как я могу проверить, правильны ли вы? – sds

1

Причины оказался следующей sqlalchemy запроса:

select * 
from table1 
join table2 
on table1.id = table2.id 

В результате DF имеет два столбца с именем id и снесет следует.

Решение:

select * 
from table1 
join (select id as id2, ... from table2) t2 
on table1.id = t2.id2 
Смежные вопросы