概要
pandasでファイルを読み込んだときに、NaNが出ないようにするだけの小ネタです。
課題
例えばpandasで次のようなsample.csvファイルを読むとします。
a | b | c |
---|---|---|
a1 | b1 | 1 |
a2 | b2 | |
a3 | 3 |
次のコードで読み込むと
import pandas as pd
df = pd.read_csv('sample.csv')
df.dtypes # 各列のtypeを表示
a列:object
b列:object
c列:float
となります。(Object型にはStr型が含まれます)
c列は「int」で読んで欲しいのですが、 df.loc[1,'c'] が「NaN」になるせいで「float型」になるわけです。
しかも、困ったことにb列の3行目の df.loc[2,'b'] も、実は「NaN」で「float型」です。
で、この「NaN」の処理が大変面倒くさい。
replaceかapplyかforループで狙い撃ちするしかない。
いっそのこと全部文字で読んでもらい、あとで数値部分だけを数値型に変換したほうが楽です。
でも、全部文字で読むなんてオプションないのですよね。
df = pd.read_csv('sample.csv', dtype=str)
としても、 df.loc[1,'c'] と df.loc[2,'b'] は「NaN」で「float型」です。
解決
しかし、見つけました。
全てを文字列で読み込む方法を。
もうひと押しすれば、できたのです。
df = pd.read_csv('sample.csv', dtype=str, na_filter=False)
これです。
これで全てがきちんと文字列です。
df.loc[1,'c'] や df.loc[2,'b'] も「''」(空文字)になりました。
以上です。