文字列を含む列を持つcsvファイルがあり、pandasで読みたいです。このファイルでは、文字列null
は実際の値として発生するため、欠損値と見なされるべきではありません。
例:
import pandas as pd
from io import StringIO
data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
print(pd.read_csv(StringIO(data)))
これにより、次の出力が得られます。
strings numbers
0 foo 1
1 bar 2
2 NaN 3
値null
をそのまま(NaNとしてではなく)DataFrameに取得するにはどうすればよいですか?ファイルには、実際に欠落している値は含まれていないと想定できます。
converters
列にstring
引数を指定できます。
pd.read_csv(StringIO(data), converters={'strings' : str})
strings numbers
0 foo 1
1 bar 2
2 null 3
これにより、パンダの自動解析がバイパスされます。
別のオプションはna_filter=False
:
pd.read_csv(StringIO(data), na_filter=False)
strings numbers
0 foo 1
1 bar 2
2 null 3
これはDataFrame全体で機能するため、注意して使用してください。代わりに列を選択するためにこれを外科的に適用する場合は、最初のオプションをお勧めします。
これが起こる理由は、文字列'null'
が解析時にNaN
として扱われるためです。@ coldspeedの答えに加えてkeep_default_na=False
を渡すことでこれをオフにできます。
In[49]:
data = u'strings,numbers\nfoo,1\nbar,2\nnull,3'
df = pd.read_csv(io.StringIO(data), keep_default_na=False)
df
Out[49]:
strings numbers
0 foo 1
1 bar 2
2 null 3
完全なリストは次のとおりです。
na_values:スカラー、str、リスト形式、または辞書、デフォルトなし
NA/NaNとして認識する追加の文字列。 dictが合格した場合、特定の列ごとのNA値。デフォルトでは、次の値はNaNとして解釈されます: ''、 '#N/A'、 '#N/AN/A'、 '#NA'、 '-1.#IND'、 '-1.#QNAN'、 「-NaN」、「-nan」、「1.#IND」、「1.#QNAN」、「N/A」、「NA」、「NULL」、「NaN」、「n/a」、「nan」 '、 'ヌル'。
デフォルトの_'NULL'
_のセットから_'null'
_と__NA_VALUES
_を動的に除外できます。
_In [4]: na_vals = pd.io.common._NA_VALUES.difference({'NULL','null'})
In [5]: na_vals
Out[5]:
{'',
'#N/A',
'#N/A N/A',
'#NA',
'-1.#IND',
'-1.#QNAN',
'-NaN',
'-nan',
'1.#IND',
'1.#QNAN',
'N/A',
'NA',
'NaN',
'n/a',
'nan'}
_
read_csv()
で使用します:
_df = pd.read_csv(io.StringIO(data), na_values=na_vals)
_
「null」をNan
として解釈せずにcsvを読み込むと、他の回答の方が優れていますが、「修正」したいデータフレームがある場合、このコードはそうします:df=df.fillna('null')