У меня есть csv-файл со столбцом со строками, и я хочу прочитать его с помощью панд. В этом файле строка 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? Можно предположить, что файл не содержит фактически пропущенных значений.
@HarvIpan, когда я запускаю их код, он дает NaN, как говорит OP ... хм
@coldspeed, интересно ..! Интересно, что я делаю не так? В любом случае, ваш хороший ответ. ~ + 1.
Я использую pandas 0.23.0 с python 3.5.2, если это поможет ...
@coldspeed, Fyi, я поменял дубликаты, этот вопрос теперь нацелен на этот старый. Тот же вопрос, но ответы здесь, вероятно, лучше.
Попробуйте использовать строку в тройных кавычках, чтобы создать многострочную строку вместо всех этих \n.






Вы можете указать аргумент 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, вы можете отключить это, передав 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, or dict, default None
Additional strings to recognize as NA/NaN. If dict passed, specific per-column NA values. By default the following values are interpreted as NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’.
Интересно, что у них есть несколько аргументов в пользу одного и того же ...
@coldspeed да, тот факт, что у вас есть разные побочные эффекты, зависит от того, указан ли na_values или нет, еще больше усложняет ситуацию
Обновлено: 2020-03-23 для Pandas 1+:
Большое спасибо @aiguofer за адаптированное решение:
na_vals = pd.io.parsers.STR_NA_VALUES.difference({'NULL','null'})
df = pd.read_csv(io.StringIO(data), na_values=na_vals, keep_default_na=False)
Старый ответ:
мы можем динамически исключить '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)
Спасибо! это почти работает, но вам также понадобится keep_default_na=False, и теперь значения по умолчанию находятся в pd.io.parsers.STR_NA_VALUES
@aiguofer, большое спасибо, что указали на это! Я соответственно изменил ответ)
Другие ответы лучше читать в CSV без интерпретации «null» как Nan, но если у вас есть фрейм данных, который вы хотите «исправить», этот код сделает это: df=df.fillna('null')
Невозможно воспроизвести проблему. Он дает мне
nullв виде строки.