web-dev-qa-db-ja.com

パンダでNULLを通常の文字列として扱う方法は?

文字列を含む列を持つ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に取得するにはどうすればよいですか?ファイルには、実際に欠落している値は含まれていないと想定できます。

28
piripiri

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全体で機能するため、注意して使用してください。代わりに列を選択するためにこれを外科的に適用する場合は、最初のオプションをお勧めします。

29
cs95

これが起こる理由は、文字列'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」 '、 'ヌル'。

15
EdChum

デフォルトの_'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)
_
5
MaxU

「null」をNanとして解釈せずにcsvを読み込むと、他の回答の方が優れていますが、「修正」したいデータフレームがある場合、このコードはそうします:df=df.fillna('null')

2
Acccumulation