Python 多索引数据帧中的Series.fillna()不填充;这是虫子吗?
对我来说,以下代码段将NaN值保留为NaN: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
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)