Python 多索引数据帧中的Series.fillna()不填充;这是虫子吗?

Python 多索引数据帧中的Series.fillna()不填充;这是虫子吗?,python,pandas,Python,Pandas,对我来说,以下代码段将NaN值保留为NaN: import pandas a = [12, 23] b = [123, None] c = [1234, 2345] d = [12345, 23456] tuples = [('eyes', 'left'), ('eyes', 'right'), ('ears', 'left'), ('ears', 'right')] events = {('eyes', 'left'): a, ('eyes', 'right'): b, ('ears', 'l

对我来说,以下代码段将NaN值保留为NaN:

import pandas
a = [12, 23]
b = [123, None]
c = [1234, 2345]
d = [12345, 23456]
tuples = [('eyes', 'left'), ('eyes', 'right'), ('ears', 'left'), ('ears', 'right')]
events = {('eyes', 'left'): a, ('eyes', 'right'): b, ('ears', 'left'): c, ('ears', 'right'): d}
multiind = pandas.MultiIndex.from_tuples(tuples, names=['part', 'side'])
zed = pandas.DataFrame(events, index=['a', 'b'], columns=multiind)
zed['eyes']['right'].fillna(value=555, inplace=True)
我得到:

part  eyes         ears       
side  left  right  left  right
a       12    123  1234  12345
b       23    NaN  2345  23456
如果在
inplace
设置为False的情况下运行此操作,则返回的序列已将
NaN
替换为555。我可以使用这种变通方法,但一方面,如果它是一个bug,我想报告它,另一方面,即使变通方法也不适用于我的实际应用程序

所以问题是我是否误解了
fillna()
,或者这是一个bug。谢谢

编辑: 我正在openSUSE 13.1上使用pandas 0.12.0、numpy 1.8.0和python 2.7.5。

的意思是将
NaN
替换为其他内容,而不是将
NaN
插入空数据槽中。详情请参阅:

In [23]: df2

        one       two     three four   five           timestamp
a       NaN  1.138469 -2.400634  bar   True                 NaT
c       NaN  0.025653 -1.386071  bar  False                 NaT
e  0.863937  0.252462  1.500571  bar   True 2012-01-01 00:00:00
f  1.053202 -2.338595 -0.374279  bar   True 2012-01-01 00:00:00
h       NaN -1.157886 -0.551865  bar  False                 NaT
[5 rows x 6 columns]

In [24]: df2.fillna(0)

        one       two     three four   five           timestamp
a  0.000000  1.138469 -2.400634  bar   True 1970-01-01 00:00:00
c  0.000000  0.025653 -1.386071  bar  False 1970-01-01 00:00:00
e  0.863937  0.252462  1.500571  bar   True 2012-01-01 00:00:00
f  1.053202 -2.338595 -0.374279  bar   True 2012-01-01 00:00:00
h  0.000000 -1.157886 -0.551865  bar  False 1970-01-01 00:00:00
[5 rows x 6 columns]
请注意,
NaT
不是时间。

我会在这里使用,因为它更明确。。。避免了整体

首先选择柱所在的子帧(右眼):

使用555,并更新:

In [12]: zed.loc[:, [('eyes', 'right')]].fillna(555)
Out[12]: 
part   eyes
side  right
a       123
b       555
[2 rows x 1 columns]

In [13]: zed.update(zed.loc[:, [('eyes', 'right')]].fillna(555))

In [14]: zed
Out[14]: 
part  eyes         ears       
side  left  right  left  right
a       12    123  1234  12345
b       23    555  2345  23456
[2 rows x 4 columns]
类似于:


有时可能有效,但不要指望它(@Jeff建议,如果所有列都是浮动的话,它可能会有效!),很可能最终会出现,而不是原始帧。

当您尝试执行类似操作时,这里有一个PR来显示警告。这也可以通过
zed.loc[:[('eyes','right')].fillna(555,inplace=True)
实现(在本例中)。我之所以这样说,是因为您有一个数据类型的帧(意味着所有的数据类型都是浮动的),@Andy Hayden soln是最好的,因为我非常清楚你在做什么。@Jeff有趣地认为我测试了它,但它对我不起作用!这里的选择是正确的,所以我的问题的答案是:我误解了
fillna()
。感谢您对如何构建正确版本的详细解释。我以前看过所有这些内容,并认为“好吧,随便什么,”但现在它们的存在真的有道理了。还有一个新的警告,有助于防止未来的我再次这样做?这样的服务,所有响应速度快的开发人员,哇!@crantila很高兴你让它工作起来了!我想需要去掉的是“就地链接”(同一行中的多个操作),即使有时有效,但最好避免使用。例如。
In [12]: zed.loc[:, [('eyes', 'right')]].fillna(555)
Out[12]: 
part   eyes
side  right
a       123
b       555
[2 rows x 1 columns]

In [13]: zed.update(zed.loc[:, [('eyes', 'right')]].fillna(555))

In [14]: zed
Out[14]: 
part  eyes         ears       
side  left  right  left  right
a       12    123  1234  12345
b       23    555  2345  23456
[2 rows x 4 columns]
zed['eyes']['right'].fillna(value=555, inplace=True)
zed.loc[:,[('eyes', 'right')]].fillna(value=555, inplace=True)