Pandas“fillna”忽略“inplace = True”关键字

时间:2017-01-18 20:24:11

标签: python python-2.7 pandas

我有一个DataFrame(相当大,难以复制& c),我观察到这种情况:

>>> 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_copyNone
  • df._is_viewFalse
  • channel是一列,而不是一个属性,因为它是info列出的

2 个答案:

答案 0 :(得分:1)

来自documentation

  

您可以使用属性访问权限来修改系列的现有元素   或者DataFrame的列,但要小心;如果你尝试使用属性   访问创建一个新列,它无声地失败,创建一个新的   属性而不是新列。

我们怀疑您先分配df.channel,然后df['channel'],这会产生意外行为。

答案 1 :(得分: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