2017-05-13 4 views
1

私はPandas read_excel関数を使用するときにいくつかの奇妙な動作を発見しました。パンダread_excelのna_valuesとコンバーターのバグの干渉?

Name age weight 
Bob  35 70 
Alice 15 ... 
Sam  ... 65 
Susan 92 63 
Harold 42 ... 

欠損値が「...」で示されており、私は彼らがNaNとして読み取るたい:私は次のようになり、スプレッドシートの不自然な例を持っています。私はまた、重みをグラムに変換したいと思います。私の最初の試みでした:

df=pd.read_excel('test.xls',na_values='...',converters={'weight':lambda y:y*1000}) 

スーザンとハロルドの欠落重みが与えられた「na_value」エントリと一致しないため、ではないん3つのドットが、3000個のドットではなくなるように、残念ながら、これは、第1変換関数を適用しますNaNに変わった。これは非常に意外です。

これは、この機能に最も適した理由がありますか?

私の実装で明らかに間違ったことをしましたか?

私が望む動作を得るにはどうすればよいですか?

答えて

2

は、na_valuesが適用される前に実行されるため、この現象が発生しています。

df = pd.read_excel("test.xls", 
        na_values="...", 
        converters={"weight":lambda w: w*1000 if isinstance(w, int) else None}) 

print(df) 

    Name age weight 
0  Bob 35.0 70000.0 
1 Alice 15.0  NaN 
2  Sam NaN 65000.0 
3 Susan 92.0 63000.0 
4 Harold 42.0  NaN 

も変換されage分野で...値を確保するために、実際のna_values引数にしてください:手巻きna_values追加など -
ただweights...インスタンスをキャッチするために、あなたのコンバータに条件を追加します。

df = pd.read_excel('test.xls', na_values='...') \ 
     .eval("weight = weight * 1000", inplace=False) 
+0

おかげで、アンドリュー。私はあなたのソリューションをちょっと微調整します:コンバーター= {"weight":lambda w:w * 1000 if isinstance(w、int)else x}) 'コンバーターは非整数値の_alone_を残すでしょう。優れている。最終的に、私は他の奇妙な行動のためにこのアプローチを断念しました。簡単な例を挙げるのは難しいですが、実際のデータでは、このようなラムダ関数を使用すると、結果の列のdtypeが変更され、Numpyの機能が一部破損します。後でDataFrame.corr()を呼び出すと、何らかの理由でラムダを受けた列が無視されます。奇妙な再度、感謝します! –

0

は、私はそれをこのようにしてください。 この操作は、read_excelの後に行います。 私はそれがより良いパフォーマンスを持っていると信じています。このよう

df=pd.read_excel('test.xls', .... 
df['weight'] *= 1000 
0

私はあなたがこのような場合にはコンバータの引数を使用する必要はないと思う:

関連する問題