奇怪的熊猫行为用上一行的值更新NaN

时间:2017-03-21 15:31:22

标签: python pandas

如果我有Excel电子表格中的数据 - 格式规定只有更改的行才能填入第一列(其他条目为空白)。然后假定该值在接下来的N行中持续存在,直到值再次变化。

所以熊猫进口如下图所示 - 这里没有惊喜:

动物

NaN的
NaN的
NaN的

NaN的
NaN的

为NaN

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

动物








我想出了以下内容,假设列名为Animal:

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

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

如果我用一个硬编码的字符串替换shift()就可以了,所以逻辑看起来不错。

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

在哪种情况下(或者如果我做错了什么) - 我该怎么做?

谢谢!

菲尔。

1 个答案:

答案 0 :(得分:3)

您可以尝试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

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

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等处Animal的值为NaN。它们不是即时更新的,就像你似乎认为的那样。您的代码行正在将NaN中的df['Animal']值替换为该特定索引处的相应移位值。这就是为什么“Cat”只填充一次,因为移位列中的下一个值是NaN

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