Как лечить 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')