Как обрабатывать NULL как обычную строку с пандами?

У меня есть 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? Можно предположить, что файл не содержит фактически пропущенных значений.

Невозможно воспроизвести проблему. Он дает мне null в виде строки.

harvpan 04.06.2018 17:17

@HarvIpan, когда я запускаю их код, он дает NaN, как говорит OP ... хм

cs95 04.06.2018 17:18

@coldspeed, интересно ..! Интересно, что я делаю не так? В любом случае, ваш хороший ответ. ~ + 1.

harvpan 04.06.2018 17:19

Я использую pandas 0.23.0 с python 3.5.2, если это поможет ...

piripiri 04.06.2018 17:20

@coldspeed, Fyi, я поменял дубликаты, этот вопрос теперь нацелен на этот старый. Тот же вопрос, но ответы здесь, вероятно, лучше.

jpp 04.06.2018 17:40

Попробуйте использовать строку в тройных кавычках, чтобы создать многострочную строку вместо всех этих \n.

jpmc26 05.06.2018 10:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
29
6
8 379
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете указать аргумент 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’.

Интересно, что у них есть несколько аргументов в пользу одного и того же ...

cs95 04.06.2018 17:23

@coldspeed да, тот факт, что у вас есть разные побочные эффекты, зависит от того, указан ли na_values или нет, еще больше усложняет ситуацию

EdChum 04.06.2018 17:25

Обновлено: 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 23.03.2020 21:59

@aiguofer, большое спасибо, что указали на это! Я соответственно изменил ответ)

MaxU 23.03.2020 22:10

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

Другие вопросы по теме