如果我有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不会以严格的顺序运行,并且可能会并行化地图操作。
在哪种情况下(或者如果我做错了什么) - 我该怎么做?
谢谢!
菲尔。
答案 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
。
如果您仍然不确定,请尝试浏览代码行的每一步,并查看每个参数的对象,就像我上面所做的那样。