对我来说,以下代码片段将 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 的情况下运行此命令,则返回的 Series 已将 NaN
替换为 555。我可以使用此解决方法,但一方面,如果这是一个错误,我想报告它,另一方面,即使解决方法也不适用于我的实际应用程序。
所以问题是我是否误解了 fillna()
或者这是一个错误。谢谢!
编辑: 我在 openSUSE 13.1 上使用 pandas 0.12.0、numpy 1.8.0 和 python 2.7.5。
最佳答案
我会在这里使用 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 建议如果所有列都是 float 的,它可能会起作用!),很可能你最终会得到 modifying a copy而不是原始框架。
关于python - MultiIndex DataFrame 中的 Series.fillna() 未填充;这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508968/