MultiIndex DataFrame中的Series.fillna()不填充;这是一个Bug吗?

时间:2013-12-11 01:41:51

标签: 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', '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.我可以使用此解决方法,但一方面,如果这是一个我想报告的错误,另一方面,即使是解决方法对我的实际应用也不起作用。

所以问题是我是否误解fillna()或者这是一个错误。谢谢!

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

2 个答案:

答案 0 :(得分:2)

我会在这里使用update,因为它更明确......并且避免了整个updating a copy thing

首先选择列所在的子帧(眼睛,右):

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

Fill in the NaN与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]

chaining in an assignment类似:

zed['eyes']['right'].fillna(value=555, inplace=True)
zed.loc[:,[('eyes', 'right')]].fillna(value=555, inplace=True)

可能有时可以工作但不依赖它( @Jeff建议如果所有列都是浮点数可能会有效!),很可能你最终会{ {3}}而不是原始框架。

答案 1 :(得分:0)

pandas.fillna()的意思是将NaN替换为,而不是将NaN插入空数据槽。有关详细信息,请参阅this example

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不是时间。