2017-03-21 208 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