pandas.read_csvを取得して、nanではなく空の文字列として空の値を読み取ります


95

pandasライブラリを使用してCSVデータを読み込んでいます。私のデータでは、特定の列に文字列が含まれています。"nan"空の文字列と同様に、文字列は可能な値です。私はパンダに "nan"を文字列として読み取らせることができましたが、空の値をNaNとして読み取らないようにする方法を理解できません。ここにサンプルデータと出力があります

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven

「nan」は文字列「nan」として正しく読み取られますが、空のセルはNaNとして読み取らstrconvertersます。read_csv の引数に(converters={'One': str}))を渡してみましたが、空のセルはNaNとして読み取られます。

fillnaを使用して、読み取り後に値を入力できることはわかっていますが、特定のCSV列の空のセルをNaNではなく空の文字列として読み取る必要があることをパンダに伝える方法はありませんか?


keep_default_na以下のより最近のオプションを使用して、より簡単な答えに注意してください。
nealmcb

回答:


55

ここに何らかのオプションを追加するチケットを追加しました:

https://github.com/pydata/pandas/issues/1450

その間、result.fillna('')あなたが望むことをすべきです

編集:開発バージョン(最終的には0.8.0)で空のリストを指定するとna_values、空の文字列は結果の空の文字列のままになります


11
のドキュメントDataFrame.fillnaお試しくださいresult.fillna('', inplace=True)。それ以外の場合は、データフレームのコピーを作成します。
Sergey Orshanskiy 2014

1
そのような古い答えを復活させて申し訳ありませんが、これが起こったことはありますか?このGitHub PRからわかる限り、マージされることなくクローズされ、パンダバージョン0.14.xで要求された動作が表示されません
drammock

9
read_csvのドキュメントでは、na_values(リストまたは列で索引付けされたdict)とkeep_default_na(bool)の両方が提供されるようになりました。このkeep_default_na値は、パンダのデフォルトのNA値を置き換えるか、追加するかを示します。このフラグがないため、OPのコードは現在動作しません。この例では、を使用できますpandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)
Michael Delgado

@delgadomに導いてくれてありがとうkeep_default_na。しかし、彼は「nan」もデフォルトとして扱われることを望まないことに注意してください。新しい答えとして、より完全な説明を追加しました。
nealmcb

再びこれに遭遇しました。修正は簡単です(最良の答えは以下のとおりkeep_default_na=Falseです)が、これに対するパンダのデフォルトの動作はIMOに良くありません。何らかの理由でpandas read_csvが列が数値でないと推定する場合、空の文字列を自動的にNaNに変更すべきではありません。
pietroppeter

108

他の回答やコメントを読んだ後、私はまだ混乱していました。しかし、答えは今より簡単に見えるので、ここに行きます。

Pandasバージョン0.9(2012以降)以降、次のように設定するだけで、空のセルを空の文字列として解釈してcsvを読み取ることができますkeep_default_na=False

pd.read_csv('test.csv', keep_default_na=False)

この問題は、より明確に説明されています

これは、2012年8月19日にパンダバージョン0.9で修正されました。


4
これは明らかに最良の答えです。最初のソリューションとして指定する必要があります。おかげで@nealmcb
dzof31

2
なぜこれがより一般的な答えではないのですか?昨日からこの解決策を探していました。ありがとう!
アニッシュ

7

これについては、Pandas read_csvに簡単な引数があります。

使用する:

df = pd.read_csv('test.csv', na_filter= False)

Pandasのドキュメントには、上記の議論がどのように機能するかが明確に説明されています。

リンク


OP na_values「ナン」を認識するために使用たいように見えますが、na_filter完全にオフにするとそれは無効になります。したがって、私の答えはkeep_default_na=False
nealmcb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.