2017-03-21 3 views
0

Excelのスプレッドシートからデータを取得した場合、変更される行には最初の列が入力されます(他のエントリは空白です)。その値は、値が再び変化するまで、次のN行について持続すると仮定されます。以下に示すようにStrange Pandas Behavior前の行の値でNaNを更新する

だから、パンダはこれをインポートしない - ここにはサプライズ:

動物

NaNの
NaNの
のNaN

NaNの
のNaN

はNaNに

私は最後の有効な値とNaNを交換する必要がある - ので、上記の例では:

動物








私は思いついた、以下、動物の列名を仮定:

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

パンダが順番に実行されている場合、それはすべき以前の "動物"は常に入力する必要がありますが、これを実行するとCat、Dog、Cowを表す最初のNaNだけが更新され、他のNaNは残ります。

私はshift()をハードコードされた文字列に置き換えると、ロジックがうまく見えます。

これは、Pandasが厳密な順序で実行されておらず、おそらくマップ操作を並列化していると仮定します。

この場合(または私が何か別のことをしている場合) - どうすればいいですか?

ありがとうございます!

フィル。

答えて

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']見つけますnull:

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 

のは、我々は1秒でこれらのnull値を置き換えるとどうなるか見てみましょう:

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.where(~df.Animal.isnull(), 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 

あなたは上記を参照できるよう、ので、インデックス2、3、などでAnimalの値はNaNです。彼らはあなたがそう思っているように、オンザフライで更新されていません。あなたのコード行は、df['Animal']NaNの値を、その特定のインデックスの対応するシフトされた値に置き換えています。そのため、シフトされた列の次の値がNaNであるため、「Cat」は1回だけ埋められます。

まだわからない場合は、上記のように、コード行の各ステップを実行し、各パラメータのオブジェクトが何であるかを確認してみてください。

+0

はい! certianly問題を解決する - 多くのありがとう!私が質問を終わらせる前に私の元の建設が失敗する理由はまだ不思議です。 – Phil

+0

私の編集をご覧ください。 – blacksite

+0

はい - これは私が疑ったものです - もう一度非常に助けてくれてありがとう! – Phil