2017-03-21 206 views
0

如果我有来自Excel电子表格的数据 - 该格式规定只有更改的行具有填写的第一列(其他条目为空)。然后假定该值持续N行,直到值再次改变。奇怪的熊猫行为更新NaN与以前行的值

所以熊猫进口此如下 - 这里没有suprises:

动物

NaN的
NaN的
NaN的

NaN的
NaN的

的NaN

我需要的最后一个有效值来替换NaN的 - 所以在上面的例子:

动物








奶牛

我想出了动物的下面,假设列名:

df.Animal.where(〜df.Animal.isnull(),df.Animal.shift())

如果熊猫在序列运行,那么它应该在以前的“动物”应该始终填充 - 但是当我运行这个时,我看到只有代表Cat,Dog和Cow的第一个NaN被更新,其他NaN仍然存在。

如果我用一个硬编码的字符串替换shift(),那么逻辑看起来很好。

我认为这意味着熊猫不会以严格的顺序运行,并且可能会并行化地图操作。

在哪种情况下(或者如果我还在做其他事情) - 我该怎么做?

谢谢!

Phil。

回答

2

你可以尝试ffill

df.Animal.ffill() 
Out[68]: 
    Animal 
0 Cat 
1 Cat 
2 Cat 
3 Cat 
4 Dog 
5 Dog 
6 Dog 
7 Cow 
8 Cow 

这相当于fillna(method='ffill')

s.Animal.fillna(method='ffill') 
Out[72]: 
0 Cat 
1 Cat 
2 Cat 
3 Cat 
4 Dog 
5 Dog 
6 Dog 
7 Cow 
8 Cow 
Name: Animal, dtype: object 

编辑:为了进一步回答你的问题,考虑以下因素:

首先,寻找到df['Animal']为空:

df.Animal.isnull() 
Out[76]: 
0 False 
1  True 
2  True 
3  True 
4 False 
5  True 
6  True 
7 False 
8  True 
Name: Animal, dtype: bool 

让我们看看,如果我们用ls替换这些空值会发生什么:

df.Animal.where(~df.Animal.isnull(), 1) 
Out[77]: 
0 Cat 
1  1 
2  1 
3  1 
4 Dog 
5  1 
6  1 
7 Cow 
8  1 
Name: Animal, dtype: object 

好吧,这是有道理的。那么,为什么不更换df.Animal.shift()的工作?

df.Animal.shift() 
Out[78]: 
0 NaN 
1 Cat 
2 NaN 
3 NaN 
4 NaN 
5 Dog 
6 NaN 
7 NaN 
8 Cow 
Name: Animal, dtype: object 

线df.Animal.where(~df.Animal.isnull(), df.Animal.shift())不会因为工作,因为你可以在索引2,3,等见上面,该值AnimalNaN。它们不会即时更新,就像您似乎认为它们一样。你的代码行将df['Animal']中的NaN值替换为该特定索引处相应的移位值。所以这就是为什么“猫”只填充一次,因为移位列中的下一个值是NaN

如果您仍然不确定,请尝试通过您的代码行的每一步,查看每个参数的对象,就像我上面所做的一样。

+0

是的!证明解决问题 - 非常感谢!仍然好奇为什么我的原始建设失败,然后我把问题关闭。 – Phil

+0

请参阅我的编辑。 – blacksite

+0

是的 - 这是我怀疑 - 再次感谢,非常有帮助! – Phil