Как лечить 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? Предполагается, что файл не содержит фактически отсутствующих значений.

Ответ 1

Вы можете указать аргумент converters для столбца string.

pd.read_csv(StringIO(data), converters={'strings' : str})

  strings  numbers
0     foo        1
1     bar        2
2    null        3

Это будет автоматическое разборки pandas.


Другим вариантом является установка na_filter=False:

pd.read_csv(StringIO(data), na_filter=False)

  strings  numbers
0     foo        1
1     bar        2
2    null        3

Это работает для всего DataFrame, поэтому используйте с осторожностью. Я рекомендую первый вариант, если вы хотите хирургически применить это, чтобы вместо этого выбрать столбцы.

Ответ 2

Причина этого в том, что строка 'null' обрабатывается как NaN при разборе, вы можете отключить ее, передав keep_default_na=False в дополнение к ответу @coldspeed:

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: scalar, str, list-like или dict, default None

Дополнительные строки для обозначения 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.

Ответ 3

мы можем динамически исключать '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)

Ответ 4

Другие ответы лучше для чтения в csv без "null", которые интерпретируются как Nan, но если у вас есть фреймворк данных, который вы хотите "фиксировать", этот код будет делать это: df=df.fillna('null')