对我来说,以下代码段将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。
答案 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]
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
不是时间。